datatable與SqlDataReader

對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();                 }             }         }

相關文章
相關標籤/搜索