从 TableAdapter 传递连接生成连接字符串 属性 尚未初始化
Passing Connection From TableAdapter Produces connectionstring property has not been initialized
我 运行 遇到一个问题,即从 TableAdapter 向某些方法传递连接会引发异常,说明 connectionstring
未初始化。关于此异常,有很多关于 SO 的问题,但 none 正在传递连接,大多数是因为 ConnectionString 为空。奇怪的是,我在整个方法链中使用了 MessageBox.Show(connection.ConnectionString);
,并且在每一步都收到了一个有效的连接字符串。这是一个正在生产中的有点复杂的程序,但我会尝试简化这个问题的代码...
这是 postInventoryData 方法,它采用带有库存项目的 DataGridView 并遍历它,将它们发布到库存。我使用 T运行sactionScope 来确保在发生错误时安全地回滚更改。如果一个项目是一个工具包(由其他项目组成的项目),我必须遍历这些项目并将它们从库存中移除。当我检查物品是否是套件时出现问题。
public bool postInventoryData(DataGridView dgv)
{
bool successful = true;
TestDataSetTableAdapters.inentoryTrxTableAdapter inventoryTrxAdapter =
new TestDataSetTableAdapters.inentoryTrxTableAdapter();
try
{
using (TransactionScope trxScope = new TransactionScope
(TransactionScopeOption.Required, new System.TimeSpan(0, 15, 0)))
{
MessageBox.Show(inventoryTrxAdapter.Connection.ConnectionString); // <-- Valid ConnectionString
inventoryTrxAdapter.OpenConnection();
for (int i = 0; i < dgv.Rows.Count; i++)
{
//parameter values
string departmentCode = dgv.Rows[i].Cells["Department_Code"].Value.ToString();
string machineCode = dgv.Rows[i].Cells["Machine_Code"].Value.ToString();
string operatorCode = dgv.Rows[i].Cells["Operator_Code"].Value.ToString();
string itemNumber = dgv.Rows[i].Cells["Item_Number"].Value.ToString();
double? qtyProduced = Convert.ToDouble(dgv.Rows[i].Cells["Quantity"].Value.ToString());
bool isKit =
businessLayer.isItemNumberKit
(inventoryTrxAdapter.Connection, itemNumber); // <-- CULPRIT!
// Inserts the item
dailyProductionInsertQty(
departmentCode,
machineCode,
operatorCode,
itemNumber,
isKit,
qtyProduced,
inventoryTrxAdapter,
trxScope);
}
inventoryTrxAdapter.CloseConnection();
trxScope.Complete();
}
}
catch (System.Exception ex)
{
successful = false;
MessageBox.Show(ex.ToString());
}
return successful;
}
isItemNumberKit 方法
public bool isItemNumberKit(SqlConnection connection, string itemNumber)
{
bool contains;
MessageBox.Show(connection.ConnectionString); // <-- Valid ConnectionString
DataTable dt = getKit(connection, itemNumber); // <-- CULPRIT!
if (dt.Rows.Count > 0)
{
contains = true;
}
else
{
contains = false;
}
return contains;
}
getKit方法
public DataTable getKit(SqlConnection connection, string itemNumber)
{
DataTable dt = new DataTable();
SqlConnection myConnection = connection;
MessageBox.Show(myConnection.ConnectionString); // <-- Valid ConnectionString
SqlParameter paramItemNumber = new SqlParameter();
paramItemNumber.ParameterName = "@ItemNumber";
paramItemNumber.Value = itemNumber;
paramItemNumber.SqlDbType = System.Data.SqlDbType.VarChar;
try
{
using (myConnection)
{
string sql =
@"SELECT kits.Row_Id,
kits.Kit_Item_Number,
kits.Location_Code
FROM Inventory.dbo.Z_PV_Kits kits
WHERE kits.Kit_Item_Number=@ItemNumber";
//myConnection.Open();
using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
{
myCommand.Parameters.Add(paramItemNumber);
SqlDataReader reader = myCommand.ExecuteReader();
dt.Load(reader);
}
}
}
catch (Exception ex)
{
dt = null;
MessageBox.Show(ex.ToString());
}
return dt;
}
当我执行 postInventoryData
时,程序抛出异常消息,"The connectionstring property has not been initialized." 行号指向 isItemNumberKit 和 getKit。正如您在上面的代码中所看到的,我在整个过程中使用了 MessageBox.Show(connection.ConnectionString)
,并且每次我收到一个有效的连接字符串。我创建了一个解决方法,它存储一个缓存的 DataTable,其中包含我可以 运行 linq 语句的所有工具包项目。我没有处于紧急模式或其他任何状态,但我认为这很奇怪,也是我学习的机会。在此先感谢您的帮助!
您的解决方案中可能有 2 个 app.config 文件和 2 个不同的连接字符串。
好吧,我想通了,现在当我想到它时,答案有些明显。我总是使用 using(){} 块来确保连接和类似对象在使用后得到妥善处理和照顾。解决方案是简单地从 getKit 方法中删除 using(myConnection){} 块,如下所示:
public DataTable getKit(SqlConnection connection, string itemNumber)
{
DataTable dt = new DataTable();
SqlConnection myConnection = connection;
MessageBox.Show(myConnection.ConnectionString);
SqlParameter paramItemNumber = new SqlParameter();
paramItemNumber.ParameterName = "@ItemNumber";
paramItemNumber.Value = itemNumber;
paramItemNumber.SqlDbType = System.Data.SqlDbType.VarChar;
try
{
string sql =
@"SELECT kits.Row_Id,
kits.Kit_Item_Number,
kits.Location_Code
FROM Inventory.dbo.Z_PV_Kits kits
WHERE kits.Kit_Item_Number=@ItemNumber
";
//myConnection.Open();
using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
{
myCommand.Parameters.Add(paramItemNumber);
SqlDataReader reader = myCommand.ExecuteReader();
dt.Load(reader);
}
}
catch (Exception ex)
{
dt = null;
MessageBox.Show(ex.ToString());
}
return dt;
}
这将使连接保持完整,但会正确处理命令。很抱歉这个冗长的问题有一个简短的答案。希望有一天这会对某人有所帮助。
我 运行 遇到一个问题,即从 TableAdapter 向某些方法传递连接会引发异常,说明 connectionstring
未初始化。关于此异常,有很多关于 SO 的问题,但 none 正在传递连接,大多数是因为 ConnectionString 为空。奇怪的是,我在整个方法链中使用了 MessageBox.Show(connection.ConnectionString);
,并且在每一步都收到了一个有效的连接字符串。这是一个正在生产中的有点复杂的程序,但我会尝试简化这个问题的代码...
这是 postInventoryData 方法,它采用带有库存项目的 DataGridView 并遍历它,将它们发布到库存。我使用 T运行sactionScope 来确保在发生错误时安全地回滚更改。如果一个项目是一个工具包(由其他项目组成的项目),我必须遍历这些项目并将它们从库存中移除。当我检查物品是否是套件时出现问题。
public bool postInventoryData(DataGridView dgv)
{
bool successful = true;
TestDataSetTableAdapters.inentoryTrxTableAdapter inventoryTrxAdapter =
new TestDataSetTableAdapters.inentoryTrxTableAdapter();
try
{
using (TransactionScope trxScope = new TransactionScope
(TransactionScopeOption.Required, new System.TimeSpan(0, 15, 0)))
{
MessageBox.Show(inventoryTrxAdapter.Connection.ConnectionString); // <-- Valid ConnectionString
inventoryTrxAdapter.OpenConnection();
for (int i = 0; i < dgv.Rows.Count; i++)
{
//parameter values
string departmentCode = dgv.Rows[i].Cells["Department_Code"].Value.ToString();
string machineCode = dgv.Rows[i].Cells["Machine_Code"].Value.ToString();
string operatorCode = dgv.Rows[i].Cells["Operator_Code"].Value.ToString();
string itemNumber = dgv.Rows[i].Cells["Item_Number"].Value.ToString();
double? qtyProduced = Convert.ToDouble(dgv.Rows[i].Cells["Quantity"].Value.ToString());
bool isKit =
businessLayer.isItemNumberKit
(inventoryTrxAdapter.Connection, itemNumber); // <-- CULPRIT!
// Inserts the item
dailyProductionInsertQty(
departmentCode,
machineCode,
operatorCode,
itemNumber,
isKit,
qtyProduced,
inventoryTrxAdapter,
trxScope);
}
inventoryTrxAdapter.CloseConnection();
trxScope.Complete();
}
}
catch (System.Exception ex)
{
successful = false;
MessageBox.Show(ex.ToString());
}
return successful;
}
isItemNumberKit 方法
public bool isItemNumberKit(SqlConnection connection, string itemNumber)
{
bool contains;
MessageBox.Show(connection.ConnectionString); // <-- Valid ConnectionString
DataTable dt = getKit(connection, itemNumber); // <-- CULPRIT!
if (dt.Rows.Count > 0)
{
contains = true;
}
else
{
contains = false;
}
return contains;
}
getKit方法
public DataTable getKit(SqlConnection connection, string itemNumber)
{
DataTable dt = new DataTable();
SqlConnection myConnection = connection;
MessageBox.Show(myConnection.ConnectionString); // <-- Valid ConnectionString
SqlParameter paramItemNumber = new SqlParameter();
paramItemNumber.ParameterName = "@ItemNumber";
paramItemNumber.Value = itemNumber;
paramItemNumber.SqlDbType = System.Data.SqlDbType.VarChar;
try
{
using (myConnection)
{
string sql =
@"SELECT kits.Row_Id,
kits.Kit_Item_Number,
kits.Location_Code
FROM Inventory.dbo.Z_PV_Kits kits
WHERE kits.Kit_Item_Number=@ItemNumber";
//myConnection.Open();
using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
{
myCommand.Parameters.Add(paramItemNumber);
SqlDataReader reader = myCommand.ExecuteReader();
dt.Load(reader);
}
}
}
catch (Exception ex)
{
dt = null;
MessageBox.Show(ex.ToString());
}
return dt;
}
当我执行 postInventoryData
时,程序抛出异常消息,"The connectionstring property has not been initialized." 行号指向 isItemNumberKit 和 getKit。正如您在上面的代码中所看到的,我在整个过程中使用了 MessageBox.Show(connection.ConnectionString)
,并且每次我收到一个有效的连接字符串。我创建了一个解决方法,它存储一个缓存的 DataTable,其中包含我可以 运行 linq 语句的所有工具包项目。我没有处于紧急模式或其他任何状态,但我认为这很奇怪,也是我学习的机会。在此先感谢您的帮助!
您的解决方案中可能有 2 个 app.config 文件和 2 个不同的连接字符串。
好吧,我想通了,现在当我想到它时,答案有些明显。我总是使用 using(){} 块来确保连接和类似对象在使用后得到妥善处理和照顾。解决方案是简单地从 getKit 方法中删除 using(myConnection){} 块,如下所示:
public DataTable getKit(SqlConnection connection, string itemNumber)
{
DataTable dt = new DataTable();
SqlConnection myConnection = connection;
MessageBox.Show(myConnection.ConnectionString);
SqlParameter paramItemNumber = new SqlParameter();
paramItemNumber.ParameterName = "@ItemNumber";
paramItemNumber.Value = itemNumber;
paramItemNumber.SqlDbType = System.Data.SqlDbType.VarChar;
try
{
string sql =
@"SELECT kits.Row_Id,
kits.Kit_Item_Number,
kits.Location_Code
FROM Inventory.dbo.Z_PV_Kits kits
WHERE kits.Kit_Item_Number=@ItemNumber
";
//myConnection.Open();
using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
{
myCommand.Parameters.Add(paramItemNumber);
SqlDataReader reader = myCommand.ExecuteReader();
dt.Load(reader);
}
}
catch (Exception ex)
{
dt = null;
MessageBox.Show(ex.ToString());
}
return dt;
}
这将使连接保持完整,但会正确处理命令。很抱歉这个冗长的问题有一个简短的答案。希望有一天这会对某人有所帮助。