2014-02-27 105 views
0

這一定很簡單,但我找不出來,或者它不可能。在sql server中創建帶變量名稱的數據庫

我有一個功能:

private static bool createDB(SqlConnection dbConn, string dbName) 
{ 
    string sqlString = "CREATE DATABASE @dbname"; 
    using (dbConn) 
    { 
     using (SqlCommand cmd = new SqlCommand(sqlString, dbConn)) 
     { 
      cmd.Parameters.AddWithValue("@dbname", dbName); 
      cmd.CommandType = CommandType.Text; 
      dbConn.Open(); 
      try 
      { 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("Se creo la DB"); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("No se creo la DB"); 
       return false; 
      } 
      finally 
      { 
       //dbConn.Close(); 
      } 
     } 
    } 
} 

但顯然@dbname沒有得到值,DBNAME確實得到我想,當我把它的名字,但除了說,不正確的語法附近「@dbname 」。

我是C#的新手,請保持良好態度:)我從準備好的語句中獲得了許多其他文章的內容,但是我找不到任何與CREATE DATABASE相關的文章,但我認爲這應該非常相似。

回答

3

你不能這樣做。數據庫名稱和字段名稱不會以這種方式工作。

string sqlString = "CREATE DATABASE " + dbname"; 

只允許參數。例如

string sqlString = "update test set myField = @myVal" 

然後你可以使用

cmd.Parameters.AddWithValue("@myVal", yourVar); 

你也不需要,因爲它只是暗示已經在Parameters.AddWithValue添加@。

您總是想要使用Parameters.AddWithValue添加參數以避免人員轉義並執行sql注入。

2

您不需要爲此使用SqlParameters,只需將dbName變量添加到您的命令文本。

private static bool createDB(SqlConnection dbConn, string dbName) 
{ 
    string sqlString = "CREATE DATABASE " + dbname; 
    using (dbConn) 
    { 
     using (SqlCommand cmd = new SqlCommand(sqlString, dbConn)) 
     { 
      cmd.CommandType = CommandType.Text; 

      dbConn.Open(); 
      try 
      { 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("Se creo la DB"); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("No se creo la DB"); 
       return false; 
      } 
      finally 
      { 
       //dbConn.Close(); 
      } 
     } 
    } 
} 

作爲一個方面說明我不會把一個消息(我想這是測試代碼)在這樣的CRUD方法更何況這離開DB連接開放,直到消息框被確認。

+0

對不起,你的回答在之前沒有解釋任何東西,這就是爲什麼我將Tsukasa答案標記爲答案,是的,我的信息箱僅用於測試目的。但我確實標記爲有用,謝謝。 – Lauro182

2

如果必須「paramertize」數據庫名,那麼我建議嘗試這樣的事情...

string sqlString = string.Format("CREATE DATABASE {0}", dbName.Trim().Replace(" ","")); 

這也將有助於防止SQL注入後衛,幫助沒有阻止,但至少你用littlebobbytables漏洞可以。

+0

艱難的人羣......甚至沒有得到一個小bobby表參考碰撞? –

+0

哈哈,小鮑比桌很棒。 – Lauro182