如何从访问数据库中获取多行
本文关键字:获取 数据库 访问 | 更新日期: 2023-09-27 17:58:52
我正在尝试基于列Veh_ID
存储访问数据库的每一行。所找到的数据可能基于多行,也可能不基于多行。我目前使用的代码可以复制单行,但如果有多个结果,我只能得到第一个结果。有人能帮我吗?当涉及到数据库时,我一无所知。我试着在谷歌上搜索,但似乎没有人需要我需要的东西。这是我正在使用的代码:
string cmd1 = "SELECT * FROM Veh_checkup WHERE Veh_ID = " + veh_idd + "";
OleDbCommand cmd = new OleDbCommand(cmd1, con);
OleDbDataReader read = cmd.ExecuteReader();
read.Read();
veh_id=null;
int i=0;
foreach (var a in read)
{
try
{
veh_id = veh_id + " " + read[i].ToString();
}
catch { }
i++;
}
我想指出一些事情,有些是针对您的问题的,有些不是:
- 使用参数化查询
- 使用
OleDbDataReader.Read()
移动到下一条记录 - 使用
StringBuilder
在循环中连接字符串,使用string = string + "something"
将在每次迭代的堆上创建一个新字符串 - 在一次性物品上使用
using
块 catch { }
不是一个好的实践。你永远不会知道发生了错误。至少你应该把错误记录在某个地方,这样你就知道你需要修复一些东西OleDbDataReader[i]
将从列i
获取当前读取记录的数据,而不是从行i
获取数据- 不要在生产代码中使用
SELECT *
,尤其是当您只使用1列时。这是不必要的从数据库中检索数据,也是不必要的网络流量 - 使用参数化查询
好吧,我知道我包括了两次使用参数化查询,但这就是我对它的强烈感受!
进行了上述更改后,您的完整代码将变成以下内容:
static string GetStringData(string vehID)
{
StringBuilder builder = new StringBuilder();
string cmd1 = "SELECT Column1 FROM Veh_checkup WHERE Veh_ID = @VehID";
using (OleDbConnection con = new OleDbConnection("YourConnectionString"))
using (OleDbCommand cmd = new OleDbCommand(cmd1, con))
{
con.Open();
cmd.Parameters.AddWithValue("@VehID", vehID);
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
builder.Append(" " + reader.GetString(0));
}
}
}
return builder.ToString();
}
您使用数据读取器的方式不对。与其像您那样只调用一次,不如像这样在一段时间内调用数据读取器:
while(theDataReader.Read())
{
// do your stuff in a loop now
}
因此,在代码中使用这种方法看起来像这样:
string cmd1 = "SELECT * FROM Veh_checkup WHERE Veh_ID = " + veh_idd + "";
OleDbCommand cmd = new OleDbCommand(cmd1, con);
OleDbDataReader read = cmd.ExecuteReader();
veh_id=null;
con.Open();
while(read.Read()) //your reader
{
try
{
veh_id = veh_id + " " + read[i].ToString();
}
catch { }
}