任何人都可以使用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();
}
}
该代码还显示与某些缺少程序集相关的错误消息。
答案 0 :(得分:4)
除了John回答的内容之外,我还强烈建议您开始将SqlConnection
和SqlCommand
放在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
添加一个程序集引用,然后才能在代码中引用它:
答案 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();