连接到服务器

时间:2013-01-03 16:47:56

标签: c# tsql sqlconnection sqlcommand sqldataadapter

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

3 个答案:

答案 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"]
      });
   }
}

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

答案 2 :(得分:0)

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

int rowsRet = cmd.ExecuteNonQuery();

SqlCommand.ExecuteNonQuery Method