簡體   English   中英

遇到string.Replace / Regex.Replace問題

[英]Having trouble with string.Replace / Regex.Replace

我有一個這樣的SQL查詢:

UPDATE StockUpdateQueue SET Synced = 1, SyncedAt = GETDATE() WHERE Id IN (@p0,@p1);

該查詢是動態生成的。 我想做的是通過一個函數運行它,該函數將有效地將所有@pN參數替換為其相應的值。

我試圖用標准的string.Replace以及Regex.Replace做到這一點,但運氣不好-替換沒有發生。

這是我到目前為止嘗試過的:

class Program
{
    static string _lastQuery;

    static void Main(string[] args)
    {
        var sqlQuery = "UPDATE StockUpdateQueue SET Synced = 1, SyncedAt = GETDATE() WHERE Id IN (@p0,@p1);";
        var sqlParamters = new Dictionary<string, object>()
        {
            { "@p0", 12345 },
            { "@p1", 65432 }
        };

        LogLastQuery(sqlQuery, sqlParamters);
    }

    static void LogLastQuery(string sqlQuery, Dictionary<string, object> sqlParamters = null)
    {
        _lastQuery = sqlQuery;
        if (sqlParamters != null && sqlParamters.Count > 0)
            foreach (KeyValuePair<string, object> sqlParamter in sqlParamters)
                _lastQuery = Regex.Replace(
                    _lastQuery, 
                    "\\@" + sqlParamter.Key,
                    sqlParamter.Value.GetType() == typeof(int) || sqlParamter.Value.GetType() == typeof(decimal)
                        ? sqlParamter.Value.ToString() 
                        : "'" + sqlParamter.Value.ToString() + "'");
    }
}

我希望函數執行參數替換並理想地輸出如下內容:

UPDATE StockUpdateQueue SET Synced = 1, SyncedAt = GETDATE() WHERE Id IN (12345,65432);

有任何想法嗎?


更新資料

我使用sqlQuerysqlParamters就像用戶un-lucky已經顯示出,即

{
    mySqlCommand.Parameters.AddWithValue(sqlParamter .Key, sqlParamter.Value);
}

事實證明,我一直在生成沒有@的字典鍵,並且.NET已自動為我添加它們(當它們丟失時-如用戶juharr )。

有時,我會動態生成sql查詢和參數-在for / foreach循環中生成鍵列表及其對應的值。 這樣就導致了混合使用的情況。

因此,為了解決這個問題-我已經像這樣更新了我的函數,它可以按預期工作:

internal void LogLastQuery(string sqlQuery, Dictionary<string, object> sqlParamters = null)
{
    _lastQuery = sqlQuery;
    if (sqlParamters != null && sqlParamters.Count > 0)
        foreach (KeyValuePair<string, object> sqlParamter in sqlParamters)
            _lastQuery = Regex.Replace(
                _lastQuery,
                (sqlParamter.Key.ToString()[0] != '@' ? "\\@" : "") + sqlParamter.Key,
                sqlParamter.Value.GetType() == typeof(int) || sqlParamter.Value.GetType() == typeof(decimal)
                    ? sqlParamter.Value.ToString()
                    : "'" + sqlParamter.Value.ToString() + "'");
}

現在處理這兩種情況。 我不確定這是否是最好的方法,但目前效果很好。

您在字典中的鍵已經有“ @”符號,請嘗試使用sqlParamter.Key代替"\\\\@" + sqlParamter.Key

我認為最好使用該查詢創建SqlCommand並將這些值添加為參數,這將是您執行查詢的最佳選擇,而不是替換。 這意味着您可以嘗試如下操作:

 var sqlQuery = "UPDATE StockUpdateQueue SET Synced = 1, SyncedAt = GETDATE() WHERE Id IN (@p0,@p1);";
 var sqlParamters = new Dictionary<string, object>()
 {
      { "@p0", 12345 },
      { "@p1", 65432 }
 };
 SqlCommand mySqlCommand = new SqlCommand(sqlQuery , conSQL); // conSQL is the connection
 foreach (KeyValuePair<string, object> sqlParamter in sqlParamters)
 {
    mySqlCommand.Parameters.AddWithValue(sqlParamter .Key, sqlParamter.Value);
 }
 mySqlCommand .ExecuteNonQuery();

暫無
暫無

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

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