这不会工作,但它尽可能接近,我想删除表Main
中的所有行。
private void button17_Click(object sender, EventArgs e)
{
String connStr,sql;
connStr = (@"SomeString");
try {
sql = "Delete from Main";
using (OleDbConnection conn = new OleDbConnection(connStr));
using(OleDbCommand cmd1 = new OleDbCommand(sql));
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
catch(Exception ex)
{
SetCon.Text = SetCon.Text + "Error " + ex + "\n
}
}
它在行上失败:
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
它不会使用错误"does not exist in this context"
进行编译。
答案 0 :(得分:2)
using (OleDbConnection conn = new OleDbConnection(connStr)){
OleDbCommand cmd1 = new OleDbCommand(sql);
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
当您使用using
(是的,英语)时,您必须定义对象(此处:conn
)有效的范围。
此范围由{ ... }
定义,其中放置了以下代码。
写using (OleDbConnection conn = new OleDbConnection(connStr);
在;
之后立即结束此范围,这意味着以下代码将无权访问该对象。
如果您想将using
与OleDbCommand
一起使用,它应该如下所示:
using (OleDbConnection conn = new OleDbConnection(connStr))
{
conn.Open();
using (OleDbCommand cmd1 = new OleDbCommand(sql))
{
cmd1.ExecuteNonQuery();
}
conn.Close();
}
如果您想了解有关using
的更多信息,请参阅Microsoft Docs:
通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法,并且(如前所示使用它时)一旦调用Dispose,它也会导致对象本身超出范围。在using块中,该对象是只读的,不能修改或重新分配。
黄色类似于conn
的范围,而橙色类似于cmd1
的范围。
如果需要,可以调用对象的范围生命周期,因为它在之后标记为Disposed
。
答案 1 :(得分:2)
C#using
语句确保在存在进程代码块时在封装的.Dispose()
对象上调用IDisposable
方法。
由于您在两个using
语句后都有分号,因此推断出OleDbConnection
和OleDbCommand
的范围仅限于那一行。
通过删除分号并将操作语句包装在弯曲括号中,指示using
范围,您可以编译代码。请注意,您可以使用共享相同范围的语句“堆叠”多个,如下所示:
using (OleDbConnection conn = new OleDbConnection(connStr))
using(OleDbCommand cmd1 = new OleDbCommand(sql))
{
conn.Open();
cmd1.ExecuteNonQuery();
conn.Close();
}
进一步阅读:using Statement
答案 2 :(得分:0)
认为您需要了解如何使用“using”关键字。它后面可能应该有一个包含部分代码的块语句。