在对查询进行分组时,无法使用ExecuteReader()检索数据

时间:2016-01-25 12:06:49

标签: c# sql wpf oledb

我需要检索存储在数千个项目的数据库中的信息。如果我通过这种方式逐个进行,则需要花费大量时间(tac是一个8个字符的字符串):

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=DataBase\IMEIDB.accdb";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    connection.Open();
    using (OleDbCommand command = connection.CreateCommand())
    {
        OleDbDataReader reader;
        command.CommandText = "SELECT TAC, Name, Model, Year, Manufacturer, LTE FROM Terminales WHERE TAC = @tac";
        command.Parameters.AddWithValue("@tac", tac);
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            ulong tac = Convert.ToUInt64(reader.GetString(0));
            if (this.DiccionarioTerminales.ContainsKey(tac))
            {
                DiccionarioTerminales[tac].inDB = true;
                DiccionarioTerminales[tac].Name = reader.GetValue(1).ToString();
                DiccionarioTerminales[tac].Manufacturer = reader.GetValue(2).ToString();
                DiccionarioTerminales[tac].Model = reader.GetValue(3).ToString();
                DiccionarioTerminales[tac].Year = reader.GetValue(4).ToString();
                DiccionarioTerminales[tac].LTE = reader.GetValue(5).ToString();
            }
        }
        command.Dispose();
    }
    connection.Dispose();
}

效果很好(我知道如果它只有一条记录我必须使用ExecuteNonQuery(),但这个例子只是一个测试),但如果我尝试将tac 10分组10(现在是tac)是一个像'xxxxxxxx','xxxxxxxx','xxxxxxxx','xxxxxxxx'...这样的字符串,我的代码中有下一个更改...

OleDbDataReader reader;
command.CommandText = "SELECT TAC, Name, Model, Year, Manufacturer, LTE FROM Terminales WHERE TAC IN (@tac)";
command.Parameters.AddWithValue("@tac", tac);

它没有进入while循环,我不知道为什么......

我是否遗漏了某些东西,或者我需要使用其他方法来检索这些数据?

编辑:根据Soner Gönül答案更改格式

1 个答案:

答案 0 :(得分:5)

因为当你在IN子句中使用这个字符串时,它似乎是;

IN (xxxxxxxx,xxxxxxxx,xxxxxxxx,xxxxxxxx)

正确的语法应为

IN ('xxxxxxxx','xxxxxxxx','xxxxxxxx','xxxxxxxx')

这就是为什么它不起作用。一种解决方案可能是,您可以使用,拆分字符串,使用单引号对其进行格式化,然后再次加入,

var str = "xxxxxxxx,xxxxxxxx,xxxxxxxx,xxxxxxxx";
var result = string.Join(",", str.Split(',').Select(s => string.Format("'{0}'", s)));

result将为'xxxxxxxx','xxxxxxxx','xxxxxxxx','xxxxxxxx',您可以在IN条款中使用它;

...TAC IN (@tac)

command.Parameters.AddWithValue("@tac", result);

也不要尽可能多地使用AddWithValueIt may generate unexpected and surprising results sometimes。使用Add方法重载来指定参数类型及其大小。

相关:Parameterize an SQL IN clause