2013-06-03 23 views
0

您好我正在編寫一個c#控制檯應用程序來將數據從一個數據庫遷移到另一個數據庫。 有數據庫行中的圖像,我需要使用@param將這些圖像包含到SQL語句中,並使用ADO.NET執行這些語句。隨機生成用於插入到SQL查詢中的@參數名稱

我需要生成隨機字符串,可以用作@param的名稱,我正在做這樣的事情。

While(blah blah) 
    { 
    if (bVisitorPhoto != null) 
      { 
       string Picture = RandomString(); 
       SqlParameter picparameter = new SqlParameter(); 
       picparameter.SqlDbType = SqlDbType.Image; 
       picparameter.ParameterName = Picture; 
       picparameter.Value = bVisitorPhoto; 
       command.Parameters.Add(picparameter); 
       VisitorPhoto = "@"+Picture; 
      } 
     string query = "insert into table Values (Picture, "PersonName");  
    } 

public static string RandomString() 
    { 
     Random rand = new Random(); 
     string Random_String = "str" + rand.Next(9999999).ToString(); 
     return Random_String; 
    } 

問題是這樣的錯誤

「SqlClient.SqlException」 變量名 '@ str5440049' 已經 被宣佈。



怎麼會這樣呢???但是,一旦我在調試模式下按F11運行程序,就像是一百萬次,我就會面臨這個錯誤

+0

你的'RandomString'需要比這更復雜:[隨機數可以重複](http://search.dilbert.com/comic/Random%20Number%20Generator),所以你應該確保你在相同的查詢中放棄你看到的那些,以避免一勞永逸的錯誤。 – dasblinkenlight

回答

5

爲什麼使用隨機而不只是列名+計數器值?

int counter=0; 
While(blah blah) 
{ 
    if (bVisitorPhoto != null) 
    { 
    string Picture = photo+counter.ToString(); 
    SqlParameter picparameter = new SqlParameter(); 
    picparameter.SqlDbType = SqlDbType.Image; 
    picparameter.ParameterName = Picture; 
    picparameter.Value = bVisitorPhoto; 
    command.Parameters.Add(picparameter); 
    VisitorPhoto = "@"+Picture; 
    } 
    string query = "insert into table Values (Picture, "PersonName");  
    counter++; 
} 
+1

+1爲了解決潛在的問題(更不用說,我不知道存儲過程如何處理隨機命名的參數。) – Andomar

3

您不應該爲每個方法調用創建一個新的Random對象。相反,創建一次,並將其存儲在一個成員變量:

private static readonly Random _rand = new Random(); 

public static string RandomString() 
{ 
    return "str" + _rand.Next(9999999).ToString(); 
} 

至於更詳細的解釋,Random.Random()構造採用了time-dependent default seed value。如果在多個構造函數調用之間沒有足夠的時間,則種子值將相同。如果你從一個相同的種子開始,那麼生成的數字序列總是相同的。