Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从access数据库中获取多行_C#_Mysql_Sql_Visual Studio - Fatal编程技术网

C# 如何从access数据库中获取多行

C# 如何从access数据库中获取多行,c#,mysql,sql,visual-studio,C#,Mysql,Sql,Visual Studio,我试图根据列Veh\u ID存储access数据库的每一行。找到的数据可能基于多行,也可能不基于多行。我当前使用的代码可以复制单行,但是如果有多个结果,我只能得到第一个结果。有人能帮我吗?说到数据库,我是个傻瓜。我试图搜索谷歌,但似乎没有人需要我需要的东西。以下是我使用的代码: string cmd1 = "SELECT * FROM Veh_checkup WHERE Veh_ID = " + veh_idd + ""; OleDbCommand cmd = new OleDbCommand(

我试图根据列
Veh\u ID
存储access数据库的每一行。找到的数据可能基于多行,也可能不基于多行。我当前使用的代码可以复制单行,但是如果有多个结果,我只能得到第一个结果。有人能帮我吗?说到数据库,我是个傻瓜。我试图搜索谷歌,但似乎没有人需要我需要的东西。以下是我使用的代码:

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

您以错误的方式使用datareader。您必须在while循环中调用datareader,而不是像这样调用一次:

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 { }

}
因此,在您的代码中使用这种方法看起来是这样的:

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 { }

}

有几件事我要指出,有些是针对你的问题的,有些不是:

  • 使用OleDbDataReader.Read()移动到下一条记录
  • 使用
    StringBuilder
    在循环中连接字符串,使用
    string=string+“something”
    将在每次迭代时在堆上创建一个新字符串
  • 在一次性对象上使用
  • 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();
}

还是不走运。它只返回一行。您能解释一下“theDataReader”变量在这里的作用吗?我使用了“read”而不是它(在while循环中),您的语句表明您只请求一个datarow。这是id与Veh_id匹配的数据行。实际上,我有多个结果对应于同一个“Veh_id”,所以我需要获得所有结果。您能建议如何请求多行吗?这是获取多行的代码。检查这个例子的一个完整的例子:如果这个或另一个答案是有用的,你应该考虑把它标记为答案或张贴自己的答案,而不是