對於C#初學者來說,我們通常遇到ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter這些對象或者方法的時候就開始犯暈,不知道哪個對象適合用增刪改,哪個對象適合查詢的時候用,本人通過 網上搜索和個人的一些理解,整理了一下,有錯誤的地方希望大家能給出指正。
一、
//數據庫連接字符串
private readonly static string connectionString = ConfigurationManager.ConnectionStrings["MyConnection"].ToString();
///
/// 執行增,刪,改的方法,支持存儲過程
///
/// 連接字符串,自滿足,請用SqlHelper.connString賦值
/// 命令類型,如果是sql語句,則為CommandType.Text,否則為 CommandType.StoredProcdure
/// SQL語句或者存儲過程名稱
/// SQL參數,如果沒有參數,則為null
/// 受影響的行數
public static int ExecuteNonQuery(CommandType commandType, string cmdText, params SqlParameter[] para)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = commandType;
cmd.CommandText = cmdText;
if (para != null)
{
cmd.Parameters.AddRange(para);
}
conn.Open();
return Convert.ToInt32(cmd.ExecuteNonQuery());
}
}
注:1、ExecuteNonQuery()執行命令對象的SQL語句,返回一個int 類型的變量,返回數據庫操作之后影響的行數。適合用來驗證對數據庫進行增刪改的情況。
2、ExecuteScalar()也可以執行sql語句。如果SQL語句是Select查詢,則僅僅返回查詢結果集中第一行第一列,而忽略其他行和列。如果SQL語句不是Select查詢,則這個返回結果沒任何作用。(建議查詢數據庫時使用) 由於不知道sql語句到底是什么樣的結構(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一個最基本的類型Object,這個類型是所有類型的基類,可以轉換為任意類型,所以所以用前需強制轉換。一般用在插入語句后加上一個 select @@identity; 返回插入ID
二、
///
/// 執行查詢的方法,支持存儲過程
/// SQL參數,如果沒有參數,則為null
/// 返回查詢結果的第一行第一列
public static object GetScalar(CommandType commandType, string cmdText, params SqlParameter[] para)
{
object result = null;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = commandType;
cmd.CommandText = cmdText;
if (para != null)
{
cmd.Parameters.AddRange(para);
}
conn.Open();
result = cmd.ExecuteScalar();
}
return result;
}
}
注:ExecuteScalar()也返回一個int型變量。如果SQL語句是Select查詢,則僅僅返回查詢結果集中第一行第一列,而忽略其他行和列。如果SQL語句不是Select查詢,則這個返回結果沒任何作用。(建議查詢數據庫時使用) 由於不知道sql語句到底是什么樣的結構(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一個最基本的類型Object,這個類型是所有類型的基類,可以轉換為任意類型,所以用前需強制轉換。
三:
///
/// 執行查詢的方法,支持存儲過程
/// SQL參數,如果沒有參數,則為null
/// 讀取器SqlDataReader
public static SqlDataReader ExecuteReader(CommandType commandType, string cmdText, params SqlParameter[] para)
{
SqlConnection conn = new SqlConnection(connectionString);
SqlDataReader dr = null;
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = commandType;
cmd.CommandText = cmdText;
if (para != null)
{
cmd.Parameters.AddRange(para);
}
conn.Open();
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
注:1、ExecuteReader方法存在的目的:盡可能快的對數據庫進行查詢並得到結果
2、ExecuteReader 返回一個DataReader對象,如果在SqlCommand對象中調用,
則返回SqlDataReader,如果在OledbCommand對象中調用,返回的是OledbDataReader,可以調用DataReader的方法和屬性迭代處理結果集。
四:
///
/// 執行查詢的方法,支持存儲過程
/// SQL語句或者存儲過程名稱
/// SQL參數,如果沒有參數,則為null
/// 數據集
public static DataSet GetDataSet(CommandType commandType, string cmdText, params SqlParameter[] para)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = cmdText;
da.SelectCommand.CommandType = commandType;
if (para != null)
{
da.SelectCommand.Parameters.AddRange(para);
}
DataSet ds = new DataSet();
conn.Open();
da.Fill(ds);
return ds;
}
}
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");
實例:
1,運用SqlDataReader 讀取數據
class DataReader
{
static void Main()
{
string str = "server=localhost;uid=sa;pwd=123;database=northwind";
SqlConnection conn = new SqlConnection(str);
SqlCommand cmd = new SqlCommand("select * from stu", conn);
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
DataTable table=new Datable();
table.Load(rdr);
rdr.Close();
conn.Close();
}
2,運用SqlDataAdapter +DataSet 讀取修改數據
class SqlDataAdapter
{
static void Main()
{
string str = "server=localhost;uid=sa;pwd=123;database=northwind";
SqlConnection conn = new SqlConnection(str);
string sql = "select * from stu";
SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);//Adepter對象
DataSet ds = new DataSet();//DataSet對象
adptr.Fill(ds, "stu");//填充DataSet 並為當前表命名
DataTableReader rdr = ds.CreateDataReader();
while (rdr.Read())//讀取表中數據
{
for (int i = 0; i < rdr.FieldCount; i++)
{
Console.Write(rdr.GetName(i) + "\t" + rdr.GetValue(i) + "\t");
}
Console.WriteLine();
}
}