在sql server中使用变量名创建数据库

时间:2014-02-27 20:06:03

标签: c# sql sql-server tsql ado.net

这一定非常简单,但我无法弄明白,或者说这是不可能的。

我有下一个功能:

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,但我认为这应该非常相似。< / p>

3 个答案:

答案 0 :(得分:3)

你不允许这样做。数据库名称和字段名称不会以这种方式工作。

string sqlString = "CREATE DATABASE " + dbname";

仅允许参数。实施例

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

然后你可以使用

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

你也不需要在Parameters.AddWithValue中添加@,因为它已经暗示了。

您总是希望使用Parameters.AddWithValue添加参数,以避免人们转义并执行sql注入。

答案 1 :(得分: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连接保持打开状态,直到消息框得到确认。

答案 2 :(得分:2)

如果你必须“参数化”数据库名称,那么我建议尝试这样的事情......

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

它还有助于防止SQL注入,有助于防止,但至少你可以使用littlebobbytables漏洞利用。