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

时间:2015-09-18 18:48:04

标签: c# ms-access oledb ms-access-2013

我需要有一个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 ,工作得很好。

我不确定这里发生了什么,但现在唯一可行的是对路径进行硬编码。我尝试过类似的问题,但没有骰子。

任何想法都将受到高度赞赏。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以编写一个为您创建字符串的方法。

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)

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