WinFrom日記————ExecuteReader、ExecuteNonQuery、ExecuteScalar使用方法
在寫C#的時候,獲取數據庫數據的時候會用到ExecuteReader、ExecuteNonQuery、ExecuteScalar等對象和方法,剛開始給自己整蒙了,不知道怎麼用用哪個,程序第一部分的內容寫的差不多了,寫幾篇博客做一些總結
數據庫連接方法:https://blog.csdn.net/weixin_44546342/article/details/106303336
一、ExecuteScalar執行方法
string Sql_Str = "update T_users set Active=@Active where Email = @Email;SELECT id from T_users where Email=@Email;";
SqlParameter[] sq =
{
new SqlParameter("@Active",Active),
new SqlParameter("@Email",Email)
};
ReadySql(Sql_Str, sq); //參數的存儲和sql語句存儲,這是我自己封裝的方法,不必太在意
object Result = sql_com.ExecuteScalar();
if(Result != null)
{
MessageBox.Show("Update successful!");
}
else
{
MessageBox.Show("Something wrong!");
}
sql_con.Close();
return;
ExecuteScalar()執行後,返回的是一個object類的數據,這個類型是所有類型的基類,可以進行任意的轉換,強制轉換就可以。
ExecuteScalar()執行後返回的數據庫第一條的第一列數據,就只返回一個數據,所以他適用於查詢總數,查詢單個id之類的情況下,查詢結果如圖;
二、ExecuteNonQuery執行方法
Sql_Str = "insert into T_Office (User_id,Office) values(@User_id,@Office)";
SqlParameter[] sql =
{
new SqlParameter("@Office",Office),
new SqlParameter("@User_id",User_id)
};
sql_com = new SqlCommand(Sql_Str, sql_con);
sql_com.Parameters.AddRange(sql);
int Result = sql_com.ExecuteNonQuery(); //執行後返回的是一個整數
if (Result>0)
{
MessageBox.Show("Add successful!");
}
else
{
MessageBox.Show("Something wrong!");
}
sql_con.Close(); //數據庫連接關閉
//sql_con.Dispose();
ExecuteNonQuery()方法執行後返回的是一個整數,即返回受Sql語句所影響的數據條數,這個執行方法可以用於數據插入、修改的時候,用來判斷Sql語句是否成功執行
另插一句,我之前寫的時候爲了判斷語句是否成功是在Sql語句後面加上SELECT @@Identity;
像這樣insert into T_Office (User_id,Office) values(@User_id,@Office);SELECT @@Identity;
即返回第幾條數據受影響吧好像,然後用ExecuteScalar()執行的,這個方法我覺得不太好,還是ExecuteNonQuery()比較好用,就這麼提一下,不要太在意
三、ExecuteReader()執行方法
List<LoginList> result_list = new List<LoginList>(); //泛型集合list<>,我也是一知半解,照着用
ReadySql(Sql_Str, sq); //參數的存儲和sql語句存儲,這是我自己封裝的方法,不必太在意
SqlDataReader Return_result = sql_com.ExecuteReader();
if (Return_result.HasRows) //使用HasRows方法判斷是否有值返回
{
while (Return_result.Read()) //通過循環一條一條的讀數據,
{
LoginList data = new LoginList();
data.User_Id = (int)Return_result["id"];
data.User_Name = Return_result["First_name"].ToString() + " " + Return_result["Last_name"].ToString();
data.Role = Return_result["Role"].ToString();
result_list.Add(data);
}
}
sql_con.Close();
泛型集合list<>
class LoginList
{
public int User_Id;
public string User_Name;
public string Role;
}
ExecuteReader()執行方法返回的類型是SqlDateReader,通過流得方式對查詢結果進行連接後訪問,只讀,適合數據量比較小的情況下,只能一條一條的讀數據,感覺有點類似指針。
適用於select查詢的情況,通過循環一條一條的讀取存入list內就行
以下部分摘抄自網絡:https://blog.csdn.net/yhj198927/article/details/72844155
SqlDataReader與SqlDataAdapter+DataSet的區別
一,SqlDataReader //基於連接,只讀訪問 適合數據量較小。(連接模式)
SqlDataAdapter //基於非連接,適於數據量較大時,可以另行修改,最後再把修改結果返回給數據庫。要求資源也大一點 (斷開模式)
二,SqlDataAdapter 讀取數據後將數據集放入DataSet ,DataSet 的數據存在本地客服機內存。
三,SqlDataReader返回的是一個數據讀寫器,只能一條條的讀,操作起來不靈活,一般在只讀的時候纔用到。
SqlDataAdapter返回的是數據集或者表,可以對其中的數據作任意操作
四,寫法上不同:
SqlDatReader執行前須先打開數據庫,然後鬚生成一個command對象。再由command.ExecuteReader()方法賦值。完成後須手動關閉聯接。
SqlCommand cmd = new SqlCommand("select * from stu", conn);
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
//。。。。。
conn.close();
SqlDataAdapter 執行時,自動打數據庫,且不用Command的ExecuteReader方法進行賦值,完成後自動斷開聯接。
SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
adptr.Fill(ds, "stu");
以上便是我總結得一點東西,如果有不對的地方請幫忙指出,相互進步,謝謝。