對datatable的認識:
之前只是用過用datatable來保存從數據庫中得到的數據殊不知道在獲得數據sql
後也能夠本身添加有關數據。例以下面的例子:
SqlDataAdapter da = new SqlDataAdapter("select * from users", "data數據庫
source=.;Initial catalog=coment_db;Integrated Security=true");
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
dt.Columns.Add("性別", typeof(int));ide
dt.Columns.Add("男女", typeof(string), "IIF([id]函數
=1,'女',IIF([id]=5,'男','人妖'))");ui
dt.Rows.Add(1);
dt.Rows.Add(0);server
DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "桂素偉";
dr[2] = "222222";對象
dt.Rows.Add(dr);
注意dt.Columns.Add()中能夠有三個參數。而第三個參數可使任何的表達事務
式:例如:IIF([id]=1,'女',IIF([id]=5,'男','人妖'))或者sum 、avg等函內存
數。在DataRow dr = dt.NewRow();時注意不要去new出DataRow它的對象。
再看下面的例子:
//dt.Columns.Add("單價", typeof(double));
//dt.Columns.Add("數量", typeof(int));
//dt.Columns.Add("金額", typeof(double), "單價*數量");
//dt.Rows.Add(23.5, 5);
//dt.Rows.Add(35, 10);
//dt.Rows.Add(40, 2);
//DataRow dr = dt.NewRow();
//dr[0] = 1.6;
//dr[1] = 67;
//dt.Rows.Add(dr);
這個例子告訴咱們dt.Columns.Add()中第三個參數能夠運算並且是兩個列名get
的相乘。和一些如上面的例子使用時的相似的應用。
下面談談SqlDataReader的一些特性:
using (SqlConnection con = new SqlConnection("Initial
catalog=coment_db;Integrated Security=true"))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM getsexcount
('true')";
cmd.Parameters.Clear();
cmd.Parameters.Add("@tssex", SqlDbType.Bit).Value =
radioButton1.Checked;
try
{
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
// DataTable dt = new DataTable();
//dt.Load(dr);
// dataGridView3.DataSource = dt;
//另外一種方法
while (sdr.Read())
{
listBox1.Items.Add(sdr.GetValue(0).ToString() +
"-" + sdr.GetValue(1).ToString() + "-" + sdr.GetValue(2).ToString
());
}
sdr.Close();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
finally
{
con.Close();
}
上面的例子是SqlDataReader的兩種使用方法,注意sdr.Read()是一次讀取一
行,讀一行返回一行。
那麼咱們就來講說SqlDataReader與DataTable的區別:DataTable爲內存表,
當把數據庫中的數據讀取到DataTable中時,咱們在界面上作操做時是對內存
表的操做並無改變數據庫表的內容。SqlDataReader爲長鏈接,當鏈接關閉
時將沒法再進行讀取數據,它是隻讀且只進的數據。
下面咱們談談存儲過程的使用和事務的使用:
存儲過程:帶輸出參數的存數過程。
using (SqlConnection con = new SqlConnection("Initial
catalog=coment_db;Integrated Security=true"))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "TSMessageCount";//存儲過程名稱
cmd.Parameters.Clear();
cmd.Parameters.Add("@begindt",
SqlDbType.DateTime).Value = dateTimePicker1.Value;
cmd.Parameters.Add("@enddt",
SqlDbType.DateTime).Value = dateTimePicker2.Value;
SqlParameter SP = new SqlParameter();
SP.ParameterName = "@Count";
SP.SqlDbType = SqlDbType.Int;
SP.Direction = ParameterDirection.Output;
cmd.Parameters.Add(SP);
try
{
con.Open();
cmd.ExecuteNonQuery();
MessageBox.Show(SP.Value.ToString());//注意咱們
須要獲得輸出參數的值
}
catch(Exception exc)
{
MessageBox.Show(exc.Message);
}
finally
{
con.Close();
}
}
下面是事務的具體應用的例子:
SqlConnection conn = new SqlConnection("Initial
catalog=coment_db;Integrated Security=true");
SqlTransaction sta = null;
try
{
conn.Open();
sta = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = sta;
cmd.CommandText = "insert into tsmessage values
('aaaa',1,GetDate(),1)";
cmd.ExecuteNonQuery();
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn;
cmd1.Transaction = sta;
cmd1.CommandText = "delete tspersons where 1=2";
cmd1.ExecuteNonQuery();
sta.Commit();
}
catch
{
sta.Rollback();
}
finally
{
conn.Close();
}
只有當上面的兩條語句都執行成功時,纔會提交到數據庫表中不然會回滾事務
。兩條都不會執行。
下面看看用自定義函數是想的功能:
//調用sql自定議函數返回值爲單值的函數
private void button9_Click(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection
("server=.;database=coment_db;uid=sa;pwd=sa;"))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "MyGsw";
cmd.Parameters.Clear();
cmd.Parameters.Add("@sex", SqlDbType.Bit).Value =
radioButton1.Checked;
SqlParameter sp = new SqlParameter();
sp.Direction = ParameterDirection.ReturnValue;
sp.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(sp);
DataTable dt = new DataTable();
try
{
con.Open();
cmd.ExecuteReader ();
MessageBox.Show(sp.Value .ToString ());
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
finally
{
con.Close();
}
}
}
//調用sql中自定義函數返回值爲表的函數
private void button10_Click(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection
("server=.;database=coment_db;uid=sa;pwd=sa;"))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * from MyTable(@sex)";
cmd.Parameters.Clear();
cmd.Parameters.Add("@sex", SqlDbType.Bit).Value =
radioButton1.Checked; try { con.Open(); SqlDataReader dr = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(dr); dataGridView1.DataSource = dt; } catch (Exception exc) { MessageBox.Show(exc.Message); } finally { con.Close(); } } }