我的ADO.NET代码有什么问题?

时间:2009-08-13 19:09:14

标签: sql-server ado.net

任何人都可以使用ADO.NET帮助我识别此程序中的错误...

代码:

using System; 
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;   // the code is showing an error in this line

class Program
{
  static void Main(string[] args)
  {
    try
    {
       string connectString = "Initial Catalog=AdventureWorks; 
                               Data Source=SQLSERVER01;
                               User id =user;password=password";
       SqlConnection con = new SqlConnection();
       con.ConnectionString = connectString;

       con.Open();

       SqlTransaction tr = null;
       tr = con.BeginTransaction();

       SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
       cmd.ExecuteNonQuery();
       tr.Commit();

       Console.WriteLine("transaction completed ");
    }
    catch (SqlException e)
    {
       tr.Rollback();
       Console.WriteLine("teansaction not completed " + e.Message);
    }
    catch (System.Exception ex)
    {
       Console.WriteLine("system error " + ex.Message);
    }
    finally
    {
       cn.Close();
    }

    Console.ReadLine();
 }
}

该代码还显示与某些缺少程序集相关的错误消息。

4 个答案:

答案 0 :(得分:4)

除了John回答的内容之外,我还强烈建议您开始将SqlConnectionSqlCommand放在using()块中 - 这样可以保证它们会在最后处理掉他们的生命和帮助避免错误。

所以而不是

   SqlConnection con = new SqlConnection();
   con.ConnectionString = connectString;

   con.Open();

   SqlTransaction tr = null;
   tr = con.BeginTransaction();

   SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
   cmd.ExecuteNonQuery();
   tr.Commit();

你应该使用:

   using(SqlConnection con = new SqlConnection(connectString))
   { 
      SqlTransaction tr = con.BeginTransaction();

      using(SqlCommand cmd = new SqlCommand("....", con, tr))
      {
         con.Open();
         cmd.ExecuteNonQuery();
         tr.Commit();
         con.Close();
      }     
   }     

还要记住:始终尽可能晚地打开您的连接(当您仍然需要创建其他对象时无需打开它 - 它只需要在ExecuteNonQuery()调用之前打开)并将其明确关闭为尽快(不要只是让它打开并等待finally {}块发生)。

马克

答案 1 :(得分:3)

您必须先向System.Transactions添加一个程序集引用,然后才能在代码中引用它:

  1. 右键单击项目中的“References”文件夹
  2. 选择“添加参考...”
  3. 从.NET程序集列表中选择“System.Transactions”

答案 2 :(得分:2)

您必须删除有问题的行:

using System.Transactions;

您不会在代码中使用System.Transactions中的任何内容。

或者如果你想保持using指令添加对System.Transactions程序集的引用。

答案 3 :(得分:0)

在此示例中,无需在事务中包装单个命令。而不是:

   con.Open();

   SqlTransaction tr = null;
   tr = con.BeginTransaction();

   SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con, tr); 
   cmd.ExecuteNonQuery();
   tr.Commit();

你用相同的代码行做同样的事情:

   con.Open();

   SqlCommand cmd = new SqlCommand("INSERT INTO sunny1(name, id, city, phone, pincode) VALUES ('sandy', 01441, 'abc', 'phone', 122001)", con); 
   cmd.ExecuteNonQuery();