在执行下面的代码时,我收到错误
ExecuteReader: Connection property has not been initialized.
[WebMethod]
public static bool GetCurrentToBin(string ToBin)
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SqlConn"].ToString());
conn.Open();
CommandFunction CF = new CommandFunction();
SqlDataReader dr;
dr = CF.ExecuteReader("exec sp_P_WMS_Stock_Adj_Validation_Proc '" + ToBin + "'");
dr.Read();
if (dr.HasRows)
{
conn.Close();
return true;
}
return false;
}
最佳答案
您可以像下面这样重构您的代码,我认为您会得到您想要的。问题是您没有在 CommandFunction 对象的任何位置指定将使用的 sql 连接。我不知道这个对象,但我认为这就是问题所在。下面的解决方案使用 SqlCommand
类。
using System.Configuration;
[WebMethod]
public static string GetCurrentToBin(string ToBin)
{
var connectionString = ConfigurationManager.ConnectionStrings["SqlConn"].ToString();
using(var conn = new SqlConnection(connectionString))
{
const string queryString = "exec sp_P_WMS_Stock_Adj_Validation_Proc @Bin";
var sqlCommand = new SqlCommand(queryString , conn);
sqlCommand.Parameters.AddWithValue("@Bin",ToBin);
conn.Open();
var reader = sqlCommand.ExecuteReader();
if(reader.Read() && !reader.IsDBNull(0))
{
return reader.GetString(0);
}
return null;
}
}
从上面的代码中你可以得到两件事:
- 我们没有显式关闭 sql 连接。我们没有显式关闭连接,而是让 using 语句为我们执行此操作。因此,每当您想要创建新的 sql 连接时,将其包装在 using 语句中,您将不需要再次记住关闭连接。
- 仅使用参数化查询。如果不这样做,您将让您的应用程序打开到 sql injections .
关于c# - 执行读取器 : Connection property has not been initialized error issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41777033/