我似乎只是在我改变了我的工作代码以使用数据视图而不是文本框来显示单行数据之后才遇到这个问题。
我有以下内容:
static SqlConnection dbConnection = new SqlConnection
(DBConnection.DBConnection.connectionString);
SqlDataAdapter holdone = new SqlDataAdapter(getCommand, dbConnection);
DataSet holdall = new DataSet();
DataSet updateall = new DataSet();
DataTable invoiceTable = new DataTable();
DataView invoiceView = new DataView();
使用的
public void GetOne(/* connectionString, string invref, string tableref*/)
{
getCommand = "select *redacted* from " + tableref +
"where *redacted* = " + invref;
using (SqlConnection dbConnection = new SqlConnection
(DBConnection.DBConnection.connectionString))
{
dbConnection.Open();
holdone.Fill(holdall);
invoiceTable = holdall.Tables[0];
dbConnection.Close();
}
DataRowView rowView = invoiceView.AddNew();
rowView["*redacted*"] = invoiceTable;
rowView.EndEdit();
}
错误报告holdone.fill(holdall)
为违规行,但我不确定为什么,因为我没有使用SQLCommand
作为参数,而是使用SQLDataAdapter
的参数
我在努力想知道自己哪里出错了?
答案 0 :(得分:3)
问题是您做将SqlDataAdapter
的选择命令字符串设置为getCommand
的当前值行:
SqlDataAdapter holdone = new SqlDataAdapter(getCommand, dbConnection);
但是,由于字符串不是真正的指针,更改getCommand
后跟不会更改 SqlDataAdapter
的选择命令。
您需要做的是:
public void GetOne(/* connectionString, string invref, string tableref*/)
{
getCommand = "select *redacted* from " + tableref + "where *redacted* = " + invref;
using (SqlConnection dbConnection = new SqlConnection(DBConnection.DBConnection.connectionString))
{
dbConnection.Open();
holdone.SelectCommand = new SqlCommand(getCommand, dbConnection);
holdone.Fill(holdall);
invoiceTable = holdall.Tables[0];
//dbConnection.Close(); // This line is unnecessary, as the connection will be closed by `using`
}
DataRowView rowView = invoiceView.AddNew();
rowView["*redacted*"] = invoiceTable;
rowView.EndEdit();
}
答案 1 :(得分:1)
在您为实际的SQL命令分配之前,您似乎已将getCommand
传递给SqlDataAdapter
构造函数。首先将getCommand
字符串初始化,然后才构造SqlDataAdapter
对象。
答案 2 :(得分:0)
您的CommandText
通过Value传递给SqlDataAdapter,而不是通过引用传递,因此在创建适配器后更改变量getCommand
不会影响数据适配器。一个非常简单的演示就是:
static void Main(string[] args)
{
string r = "Test";
using (var adapter = new SqlDataAdapter(r, new SqlConnection("")))
{
r = "Test2";
Console.WriteLine(adapter.SelectCommand.CommandText);
}
}
输出
测试
不
的Test2
您需要明确更改适配器的SelectCommand.CommandText:
holdone.SelectCommand.CommandText = getCommand;
如果值得重复使用这样的对象是没有用的,它甚至几乎不会保存代码。 .NET使用连接池,因此使用多个SQL连接/适配器并不一定意味着数据库有多个管道。您还应该使用parameterised queries:
string sql = "select *redacted* from " + tableref + " where *redacted* = @InvoiceParam";
using (var adapter = new SqlDataAdapter(sql, DBConnection.DBConnection.connectionString))
{
adapter.SelectCommand.Parameters.AddWithValue("@InvoiceParam", invRef);
adapter.Fill(holdall);
invoiceTable = holdall.Tables[0];
}