我正在尝试使用SQL和OleDB编写程序,并且在程序运行时出现错误。 程序首先计算表中的行数(访问表称为'tblCodons') 并将数字存储为j中的整数。
然后程序将所有行(来自名为'codonsFullName'的特定列)存储在comboBox1中。 代码如下 我得到这个错误: System.Data.OleDb.OleDbException(0x80040E14):无效的SQL语句;必需的值'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE < / p>
代码:
int j=0;
OleDbConnection conn1 = new OleDbConnection(connectionString);
conn1.Open();
string sqlCount= "SET @j= SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons";
OleDbCommand counter = new OleDbCommand(sqlCount, conn1);
counter.ExecuteNonQuery();
conn1.Close();
OleDbConnection conn2 = new OleDbConnection(connectionString);
conn2.Open();
string sqlFill = "SELECT tblCodons.codonsFullName FROM tblCodons";
OleDbCommand fill = new OleDbCommand(sqlFill, conn2);
fill.ExecuteNonQuery();
OleDbDataReader dataReader = fill.ExecuteReader();
dataReader.Read();
for (int i = 0; i < j; i++)
{
comboBox1.Items.Add(dataReader.GetString(i));
}
答案 0 :(得分:5)
您似乎只需要循环计数。另外我不明白为什么你在执行之前执行fill.ExecuteNonQuery()作为读者。
在sql查询中设置@j(如果它确实有效)在您尝试设置的代码中没有范围到本地变量j。
您应该只需要以下代码(对任何语法错误道歉)
OleDbConnection conn2 = new OleDbConnection(connectionString);
conn2.Open();
string sqlFill = "SELECT tblCodons.codonsFullName FROM tblCodons";
OleDbCommand fill = new OleDbCommand(sqlFill, conn2);
OleDbDataReader dataReader = fill.ExecuteReader();
int j = 0;
if (dataReader.HasRows)
{
while(dataReader.Read())
{
comboBox1.Items.Add(dataReader.GetString(0));
j++;
}
}
希望有所帮助
答案 1 :(得分:1)
在此留下这个答案作为修复目前存在的代码的解释,但也想指出我建议采用Kamal的解决方案;它只查询数据库一次。
这一行可能是你的错误:
string sqlCount= "SET @j= SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons";
更改为
string sqlCount= "SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons";
您想要更改代码以获取第一个查询的结果,如下所示:
j = counter.ExecuteScalar();
答案 2 :(得分:0)
首先,正如Kamal所提到的,你不能像你想要的那样直接从sql查询设置一个变量,并且作为异常状态只有“SELECT”,“INSERT”,“UPDATE”和“DELETE”命令可以是在查询中使用。
其次,我不知道为什么在获取实际数据之前需要获取记录计数,但如果确实有必要,可以像这样编写查询:
var query="SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons;SELECT tblCodons.codonsFullName FROM tblCodons;";
然后,您可以使用单个DataReader执行两个查询。当您执行DataReader.ExequteQuery()时,它将包含两个结果。第一个可以访问计数,第二个可以访问实际数据。 Here是一个例子