2014-02-27 72 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