这一定非常简单,但我无法弄明白,或者说这是不可能的。
我有下一个功能:
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>
答案 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漏洞利用。