c# - 检查数据库是否存在 MSSQL C#
问题描述
我有这样的代码:
private bool CheckDatabase(string databaseName, bool bRet)
{
string connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
string cmdText = "select * from master.dbo.sysdatabases where name=\'" + databaseName + "\'";
using (SqlConnection sqlConnection = new SqlConnection(connString))
{
sqlConnection.Open();
using (SqlCommand sqlCmd = new SqlCommand(cmdText, sqlConnection))
{
int nRet = sqlCmd.ExecuteNonQuery();
// regMessage.Text = nRet.ToString();
if (nRet <= 0)
{
bRet = false;
}
else
{
bRet = true;
}
}
}
return bRet;
}
然而
nRet
结果总是-1,好像数据库不存在(它确实存在)。是因为数据库是空的吗?或者如果创建了数据库,它是否应该返回 >0,即使它是空的?顺便说一句,字符串 databaseName 是正确的。
编辑>编辑:我在“CREATE DATABASE @database”ssql命令上也遇到了stage错误:
'@userDatabase' 附近的语法不正确
代码是这样的:
var connString = "Server=localhost\\SQLEXPRESS;Integrated Security = SSPI; database = master";
string cmdText = "CREATE DATABASE @userDatabase";
using (var sqlConnection = new SqlConnection(connString))
{
using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
{
sqlCmd.Parameters.Add("@userDatabase", System.Data.SqlDbType.NVarChar).Value = databaseName;=
sqlConnection.Open();
sqlCmd.ExecuteNonQuery();
}
}
解决方案
- 使用参数化查询。
- 使用
Select count(*)
而不是Select *
. - 使用
ExecuteScalar
代替ExecuteNonQuery
- 请注意代码上的注释,它们解释了我所做的更改。
// No point of passing a bool if all you do is return it...
private bool CheckDatabase(string databaseName)
{
// You know it's a string, use var
var connString = "Server=localhost\\SQLEXPRESS;Integrated Security=SSPI;database=master";
// Note: It's better to take the connection string from the config file.
var cmdText = "select count(*) from master.dbo.sysdatabases where name=@database";
using (var sqlConnection = new SqlConnection(connString))
{
using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
{
// Use parameters to protect against Sql Injection
sqlCmd.Parameters.Add("@database", System.Data.SqlDbType.NVarChar).Value = databaseName;
// Open the connection as late as possible
sqlConnection.Open();
// count(*) will always return an int, so it's safe to use Convert.ToInt32
return Convert.ToInt32( sqlCmd.ExecuteScalar()) == 1;
}
}
}
推荐阅读
- excel - 如何在 MS Access 中为 Excel 电子表格导入提供错误处理
- python - R readBin 与 Python 结构
- python - 用于部署 python 机器学习模型的通用 Web 服务器/框架?
- sql - 旧数据库格式迁移
- android - Qt android 电子邮件
- java - 打印二维阵列的方法
- android - 从活动转到主要活动并再次返回活动后,音高检测 (TarsosDSP) 不起作用
- ios - 如何在 Xcode 的 Storyboard 中保持高分辨率图像而不使其像素化?
- c# - 调用 JsonConvert.SerializeObject 时如何转换编码的 JSON 字符串属性?
- javascript - 低效的正则表达式?