簡體   English   中英

無法將參數添加到查詢字符串

[英]Can't Add Parameter To Query String

我需要第二張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運行正常。

我不太確定這里發生了什么,但是目前唯一有效的方法是對路徑進行硬編碼。 我試圖通過類似的問題,但沒有骰子。

任何想法將不勝感激。

謝謝。

您可以編寫一個為您創建字符串的方法。

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)

我假設您知道公共方法,私有方法和靜態方法之間的區別,所以請不要忘記根據自己的需要進行設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM