我需要有一个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 ,工作得很好。
我不确定这里发生了什么,但现在唯一可行的是对路径进行硬编码。我尝试过类似的问题,但没有骰子。
任何想法都将受到高度赞赏。
谢谢。
答案 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)
我假设你知道公共方法,私有方法和静态方法之间的区别,所以请不要忘记根据自己的需要进行设置。