我遇到了这个小问题:每次我的代码执行下面的InsertOrder()例程时,我都会收到这样的异常消息:“连接字符串尚未初始化”。
下面是InsertOrder()方法的代码:
private void InsertOrder()
{
string insertSQL = "";
insertSQL += "INSERT INTO Orders (";
insertSQL += "UserName, DateCreated, LastUpdate, Description, PaymentType, Delivery, Total) ";
insertSQL += "VALUES (@UserName, @DateCreated, @LastUpdate, @Description, @PaymentType, @Delivery, @Total)";
SqlCommand cmd0 = new SqlCommand(insertSQL, connection);
// Adds the parameters
cmd0.Parameters.AddWithValue("@UserName", Profile.UserName.ToString());
cmd0.Parameters.AddWithValue("@DateCreated", Profile.Orders.SCart.DateCreated());
cmd0.Parameters.AddWithValue("@LastUpdate", Profile.Orders.SCart.LastUpdate());
cmd0.Parameters.AddWithValue("@Description", Profile.Orders.SCart.GetCartDescription());
cmd0.Parameters.Add("@PaymentType", SqlDbType.Bit).Value = Profile.Orders.SCart.PaymentType;
cmd0.Parameters.Add("@Delivery", SqlDbType.Bit).Value = Profile.Orders.SCart.Delivery;
cmd0.Parameters.AddWithValue("@Total", Profile.Orders.SCart.Total);
try
{
using (connection)
{
connection.Open();
cmd0.ExecuteNonQuery();
}
string selectSQL = "SELECT OrderID FROM Orders WHERE UserName=@UserName AND DateCreated=@DateCreated";
SqlCommand cmd1 = new SqlCommand(selectSQL, connection);
cmd1.Parameters.AddWithValue("@UserName", Profile.UserName);
cmd1.Parameters.AddWithValue("@DateCreated", Profile.Orders.SCart.DateCreated());
SqlDataReader reader;
using (connection)
{
connection.Open();
reader = cmd1.ExecuteReader();
reader.Read();
OrderID = (int)reader["OrderID"];
reader.Close();
}
// Store registered customer information for later usage..
if (!Profile.IsAnonymous)
{
string insertSQL2 = "";
insertSQL2 += "INSERT INTO CategoriesInAnOrder (";
insertSQL2 += "OrderID, CategoryID, Quantity) VALUES (@OrderID, @CategoryID, @Quantity)";
foreach (CartItem item in Profile.Orders.SCart.Items)
{
SqlCommand cmd2 = new SqlCommand(insertSQL2, connection);
cmd2.Parameters.AddWithValue("@OrderID", OrderID);
cmd2.Parameters.AddWithValue("@CategoryID", item.CategoryID);
cmd2.Parameters.AddWithValue("@Quantity", item.Quantity);
using (connection)
{
connection.Open();
cmd2.ExecuteNonQuery();
}
}
}
}
catch (Exception err)
{
pnlWizard.Visible = false;
lblError.Text = err.Message;
}
} 也许值得说的是,我在SuperClass中放置了一个SqlConnection对象,因此每个子类(如包含上述方法的子类)都继承此属性。
shared SqlConnection对象设置如下:
protected SqlConnection connection = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString);对不起,我的英语...我是意大利人
发布于 2011-07-04 23:07:50
我认为
using(connection)可能是你问题的根源。
using()将导致在调用完成时在连接上调用Dispose(),但您的连接只被实例化一次。
下一次你使用它时,它将不会处于健康状态!
请考虑每次创建一个新连接:
protected SqlConnection connection
{
get
{
return new SqlConnection
(System.Web.Configuration.WebConfigurationManager.ConnectionStrings
["DefaultConnectionString"].ConnectionString);
}
}发布于 2011-07-04 23:14:11
我怀疑问题在于您正在using字段中的值。这将只工作一次,但是在Dispose() 之后,您已经注定了该连接的。
对于这个场景,我使用了一个自定义的EnsureOpen()方法,如果它还没有打开,它将返回一个IDisposable;用法:
using(connection.EnsureOpen())
{
// use it
}这样,就不会过早地释放连接,而是在需要时打开连接。另外,无论它是否已经打开,它都是有效的。
如果你愿意,我可以稍后分享EnsureOpen。
https://stackoverflow.com/questions/6573157
复制相似问题