将数据库中的值存储到组合框中

本文关键字:组合 存储 数据库 | 更新日期: 2023-09-27 18:15:56

我正在尝试使用SQL和OleDB编写程序,并且在程序运行时出现错误。程序首先计算表(访问名为"tblCodons"的表)中的行数并将数字以整数形式存储在j.

则程序将所有行(来自称为'codonsFullName'的特定列)存储在comboBox1中。代码如下我得到这个错误:System.Data.OleDb。oledbexcexception (0x80040E14):无效的SQL语句,必需的值为DELETE, INSERT, PROCEDURE, SELECT或UPDATE

代码:

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));
}

将数据库中的值存储到组合框中

似乎只有在循环中才需要计数。我也不明白为什么你在执行之前执行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++;
   }
}

希望有帮助

把这个答案留在这里,作为修复当前存在的代码的解释,但也想指出我建议使用Kamal的解决方案;它只查询数据库一次。

这一行可能是你的错误:

string sqlCount= "SET @j= SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons";

改变

string sqlCount= "SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons";

您需要更改代码以获得第一个查询的结果,如下所示:

j = counter.ExecuteScalar();

首先,正如Kamal提到的,您不能直接从sql查询中设置变量,因为您正在尝试这样做,并且作为例外状态,只有"SELECT"," INSERT","UPDATE"answers"DELETE"命令可以在查询中使用。

第二,我不知道为什么你需要在获得实际数据之前获得记录计数,但如果真的有必要,你可以这样写你的查询:

var query="SELECT COUNT(tblCodons.codonsFullName) FROM tblCodons;SELECT tblCodons.codonsFullName FROM tblCodons;";

那么您可以使用单个DataReader执行这两个查询。当您执行DataReader.ExequteQuery()时,它将包含两个结果。第一个可以访问计数,第二个可以访问实际数据。下面是一个例子