尝试提高我的C#到SQL技能......目前我正在使用这段代码从我们的应用服务器中提取数据。我有两个不同的DBA告诉我另外两种写这个的方法,只是想弄清楚是否应该改进或改变。如果是这样,我会非常感谢某些例子。
仅供参考:此代码......
db.con(user.Authority)
...本质上是一个'新的sqlconnection'代码。
DataTable dtInfo = new DataTable("SomeInfo");
using (SqlConnection con = db.con(user.Authority))
{
string command = "SOME SQL STATEMENT;";
using (SqlCommand cmd = new SqlCommand(command,con))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Param", sqlDbType).Value = Param;
con.Open();
cmd.ExecuteNonQuery();
**********
*** OR ***
**********
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Param", sqlDbType).Value = Param;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dtInfo );
}
}
}
那么,如果我理解所提供的信息,这是我最好的路线?
using (SqlConnection con = db.con(user.Authority))
{
string command = "SELECT [TBL_EMPLOYEE].[ACTIVE_DIRECTORY] FROM [TBL_EMPLOYEE];";
using (SqlCommand cmd = new SqlCommand(command, con))
{
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MessageBox.Show(reader["ACTIVE_DIRECTORY"].ToString());
}
}
}
最后一件事......这应该可以防止
的需要cmd.Dispose();
etc...
答案 0 :(得分:1)
代码取决于具体的查询。如果查询检索数据行(如SELECT那样),那么你将转到da.Fill()路由。如果它只是对数据库进行更改的查询(例如INSERT,UPDATE或DELETE),那么您将使用ExecuteNonQuery()。
答案 1 :(得分:0)
我不会使用SqlDataAdapter
版本。使用SqlCommand
对象和SqlDataReader
的版本效果会更好,并且可以更深入地了解返回的实际数据。
// Assumes the following sql:
// SELECT foo, bar FROM baz
// error checking left out for simplicity
var list = new List<SomeClass>();
using(var reader = cmd.ExecuteReader()) {
while(reader.Read()) {
list.Add(new SomeClass {
// NOTE: you can see the columns that the c# is referencing
// and compare them to the sql statement being executed
Foo = (string)reader["foo"],
Bar = (string)reader["bar"]
});
}
}
稍后随着您的实验水平的提高,您将能够使用SqlCommand
和SqlDataReader
类的其他功能,以确保代码尽快执行。如果您开始使用SqlDataAdapter
路线,您最终将不得不重新学习如何执行您已经做过的完全相同的事情,因为SqlCommand
和SqlDataReader
具有其他地方不存在的操作在.NET中。
答案 2 :(得分:0)
ExecuteNonQuery返回受影响的行数 DataTable不是检索该数字的有效方法。
int rowsRet = cmd.ExecuteNonQuery();