2013-08-27 20 views
2

我有这个代码工作,但我知道我应该使用参数来代替。如何使用N参数从C#更新MS Access中的前N行?

foreach (ListViewItem item in lstViewFuentes.CheckedItems) 
{ 
    cmdUpdate.CommandText = "UPDATE (SELECT TOP " + int.Parse(item.SubItems[2].Text) + " seleccionada " + 
          "FROM PreguntasRespuestas " + 
          "WHERE nombreFuente = ?) AS pyr " + 
          "SET pyr.seleccionada='S'";   
    cmdUpdate.Parameters.Add("@nombreFuente", OleDbType.VarChar).Value = item.SubItems[0].Text ; 
    cmdUpdate.ExecuteNonQuery(); 
    cmdUpdate.Parameters.Clear(); 
} 

如果你同意我的观点,这个代码下一块是应该的方式样子,但是这给了我一个错误

cmdUpdate.CommandText = "UPDATE (SELECT TOP ? seleccionada " + 
         "FROM PreguntasRespuestas " + 
         "WHERE nombreFuente = ?) AS pyr " + 
         "SET pyr.seleccionada='S'"; 

foreach (ListViewItem item in lstViewFuentes.CheckedItems) 
{ 

    cmdUpdate.Parameters.Add("@numPreguntas", OleDbType.Integer).Value = int.Parse(item.SubItems[2].Text); 
    cmdUpdate.Parameters.Add("@nombreFuente", OleDbType.VarChar).Value = item.SubItems[0].Text ; 
    cmdUpdate.ExecuteNonQuery(); 
    cmdUpdate.Parameters.Clear(); 
} 

当我使用上面的块,我收到错误说,SELECT指令包含一个保留字,错过一个参数或拼写错误等等...我不明白为什么它不需要?作为SELECT TOP中的N的参数...

回答

1

访问'数据库引擎将不接受SELECT TOP的参数。您必须在SQL语句中静态提供值。请参阅Limit # of records returned based on a form control

+1

好吧,这是Access的数据库引擎的限制,谢谢,我现在感觉很好,我花了很多时间来尝试做这项工作。 –