1

试图提高我的 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...
4

3 回答 3

1

该代码将取决于特定的查询。如果查询检索数据行(如 SELECT 所做的那样),那么您将使用 da.Fill() 路线。如果它是一个只对数据库进行更改的查询(例如 INSERT、UPDATE 或 DELETE),那么您将使用 ExecuteNonQuery()。

于 2013-01-03T16:54:58.883 回答
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"]
      });
   }
}

稍后随着您的经验水平的提高,您将能够使用SqlCommandSqlDataReader类的其他功能,以确保代码尽快执行。如果您开始使用该SqlDataAdapter路由,您最终将不得不重新学习如何执行您已经在做的完全相同的事情,因为SqlCommandSqlDataReader具有 .NET 中其他地方不存在的操作。

于 2013-01-03T16:55:25.480 回答
0

ExecuteNonQuery 返回影响的行数。
DataTable 不是检索该数字的有效方法。

int rowsRet = cmd.ExecuteNonQuery();

SqlCommand.ExecuteNonQuery 方法

于 2013-01-03T17:24:21.307 回答