无法将参数添加到查询字符串

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)

我假设您知道公共、私有和静态方法之间的区别,所以请不要忘记根据自己的需要进行设置。

【讨论】:

以上是关于无法将参数添加到查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

将查询字符串参数添加到 link_to

查询长度未知时如何向查询添加参数

使用 jquery 将查询字符串添加到 url

为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?

无法读取查询参数,因为 vue.js 将 #/ 添加到 url 的末尾

将Devise Login的返回URL指定为查询字符串参数