下面是我的代码,我不能为我的生活找出问题的错误。
我最初有错误“没有给出一个或多个参数的值”,这似乎已经消失了(虽然我甚至不知道为什么我会得到它)。
在此代码之前打开连接。 参数GVars.thisFY是一个字符串=“FY13” - 这个表肯定存在。 参数GVars.currentDate是DateTime = today。
此[目的地]和[下一个收藏]范围确实存在记录:
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)
{
}
编辑: 我已经更改了代码以删除表参数,如下所示,仍然得到“没有给出一个或多个参数的值”,虽然我无法确定..
EDIT2:我删除了额外的东西,所以帖子只涉及原始问题,已被回答。我会为我奇怪的“没有给定值”错误提出一个新问题
答案 0 :(得分:5)
您无法使用表,视图或列的名称参数化查询。只能对数据成员进行参数化。
您需要动态制作SQL,例如像这样:
sql = string.Format(
"SELECT * FROM {0} WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;"
, GVars.thisFY
);
只有当您的代码控制GVars.thisFY
时才应该这样做,例如来自预定义列表或检查是否缺少非字母数字字符以避免SQL injection attacks。
答案 1 :(得分: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));