【发布时间】: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不好。做有效的事情,如果您有时间实施其他事情,请尝试一下。
标签: c# ms-access oledb ms-access-2013