无法将参数添加到查询字符串
Posted
技术标签:
【中文标题】无法将参数添加到查询字符串【英文标题】:Can't Add Parameter To Query String 【发布时间】:2015-09-18 18:48:03 【问题描述】:我需要保存在网络驱动器中的 MS Access 表的第二个副本。而且由于拆分不是一种选择,因为它会大大降低应用程序的速度,因此我决定在单击退出按钮等特定用户操作后手动“合并”数据。
我有这个查询字符串
public const string MERGETOMAIN = @"INSERT INTO tbl_name (UserID, ...)" +
" IN 'C:\Users\nathan\Desktop\copy.accdb' SELECT TOP 1 UserId, ... " +
" FROM tbl_name WHERE UserID = @currentUser ORDER BY ROWID DESC";
...当我这样做时它会起作用:
using (OleDbCommand cmd = new OleDbCommand(Helpers.Queries.MERGETOMAIN, mergeConn))
cmd.Parameters.AddWithValue("@currentUser", currentUserID);
cmd.ExecuteNonQuery();
但是,正如您所注意到的,副本的路径是硬编码的。我希望它是动态的,所以我尝试像往常一样使用参数,所以我用问号替换了它:
public const string MERGETOMAIN = @"INSERT INTO tbl_name (UserID, ...)" +
" IN ? SELECT TOP 1 UserId, ... " +
" FROM tbl_name WHERE UserID = @currentUser ORDER BY ROWID DESC";
但这会导致以下错误:
您的网络访问被中断。继续关闭数据库,然后再次打开它。
所以我用 @parameterName 代替了问号。但是,当我这样做时,我收到以下错误:
找不到文件“foo\foo\@parameterName”。
奇怪的是,另一个参数 @currentUser 工作正常。
我不太确定这里发生了什么,但目前唯一可行的方法是对路径进行硬编码。我尝试查看类似的问题,但没有骰子。
任何想法将不胜感激。
谢谢。
【问题讨论】:
为什么不把它存储在配置文件或其他东西中,然后将它连接到您的查询字符串中? 事实上,我确实将路径存储在配置文件中,并且我正在使用它来为参数提供值。我想我只是习惯了将值连接到查询字符串是不好的想法。不过谢谢。我试试看。 有人说用代码写SQL不好。做有效的事情,如果您有时间实施其他事情,请尝试一下。 【参考方案1】:您可以编写一个为您创建字符串的方法。
public string getMergeToMain(string path)
string strRet;
if (path != null)
strRet = @"INSERT INTO FSO_LogSheet (UserID, ...)" +
" IN '" + path + "' SELECT TOP 1 UserId, ... " +
" FROM FSO_LogSheet WHERE UserID = @currentUser ORDER BY ROWID DESC";
return strRet;
else
//Error, not agood habit to return null...
return null;
通过方法参数“path”,可以动态设置路径。
你可以调用它,例如
OleDbCommand cmd = new OleDbCommand(fooClass.getMergeToMain(@"C:\users\bar.accdb"), mergeConn)
我假设您知道公共、私有和静态方法之间的区别,所以请不要忘记根据自己的需要进行设置。
【讨论】:
以上是关于无法将参数添加到查询字符串的主要内容,如果未能解决你的问题,请参考以下文章
为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?