1

以下是我拥有的代码,我一生都无法弄清楚查询出了什么问题。

我最初遇到错误“没有为 1 个或多个参数提供值”,它似乎已经消失了(尽管我什至不知道为什么我得到它)。

连接在此代码之前打开。参数 GVars.thisFY 是一个字符串 = "FY13" - 这个表肯定存在。参数 GVars.currentDate 是 DateTime = 今天。

此 [Destination] 和 [Next Collection] 范围内肯定存在记录:

string sql;
OleDbDataAdapter adapter;

sql = "SELECT * FROM @CurFY WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;";

// Create the command object
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;

// Add values to the fields
cmd.Parameters.AddWithValue("@CurFY", GVars.thisFY);
cmd.Parameters.AddWithValue("@Destination", "Henwood");
cmd.Parameters.AddWithValue("@NextCollectionA", GVars.currentDate);
cmd.Parameters.AddWithValue("@NextCollectionB", GVars.currentDate.AddDays(1));

adapter = new OleDbDataAdapter(cmd.CommandText, conn);

try
{
    adapter.Fill(ds);

    GVars.bLblLastUpdate = DateTime.Now.ToString("HH:mm:ss");
}
catch (Exception ex)
{
}

编辑:我已更改代码以删除表参数,如下所示,仍然得到“没有为 1 个或多个参数提供值”,尽管我无法确定..

EDIT2:我删除了额外的内容,因此该帖子仅与已回答的原始问题有关。我将为我奇怪的“没有给出值”错误提出一个新问题

4

2 回答 2

5

您不能使用表、视图或列的名称来参数化查询。只有数据成员可以参数化。

您需要动态创建 SQL,例如:

sql = string.Format(
    "SELECT * FROM {0} WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;"
,  GVars.thisFY
);

GVars.thisFY仅当由您的代码控制时才应执行此操作,例如来自预定义列表或检查是否缺少非字母数字字符以避免SQL 注入攻击

于 2013-06-10T11:02:52.127 回答
1

试试这个——

sql = Sring.Format(
    "SELECT * FROM {0} WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;", 
    GVars.thisFY
)

cmd.Parameters.AddWithValue("@Destination", "Henwood");
cmd.Parameters.AddWithValue("@NextCollectionA", GVars.currentDate);
cmd.Parameters.AddWithValue("@NextCollectionB", GVars.currentDate.AddDays(1));
于 2013-06-10T11:03:09.867 回答