c# - 如何从用 C# 编写的程序修复 SQL 中的“文件激活错误”错误消息?
问题描述
我编写了一个使用数据库的 C# 程序,Matches.mdf
.
我想测试数据库文件的存在,使用File.Exists
例程(代码将出现在问题的末尾)。如果该文件不存在,程序将创建一个具有上述名称的新数据库。为了测试数据库存在例程,我重命名了数据库文件,但是当我想创建数据库时,我收到以下错误消息:数据库“匹配”已存在,请指定不同的名称。
在第二次测试中,我在调用创建例程之前使用了数据库删除例程。大错。每次我尝试创建Matches.mdf
数据库时,都会收到以下错误消息:
我确信这个错误消息的原因是我,修补,因为相同的数据库创建和删除例程以前工作得很好。
我知道我可以通过更改数据库文件的路径来解决问题,但我想知道我到底在这里分手了什么,以便下次知道。
我要问的是:我该怎么做才能解决上述错误?
稍后编辑:我尝试Matches.mdf
使用来自 VS 2019 的 SQL Server 对象资源管理器中的查询工具手动重新创建。效果很好,但我认为这不是一个长期的好解决方案。
必要代码:
变量声明:
static readonly string DatabaseFolder = Path.GetDirectoryName(Application.ExecutablePath) + "\\db";
readonly string DatabaseFile = DatabaseFolder + "\\Matches.mdf";
readonly string DatabaseLog = DatabaseFolder + "\\MatchesLog.ldf";
检查数据库文件是否存在的函数:
public bool DatabaseExists()
{
return File.Exists(DatabaseFile);
}
数据库创建例程:
private bool CreateDatabaseFile()
{
SqlConnection MyConn = new SqlConnection(CreateDatabaseConnectionString);
string Str = "Create Database Matches on Primary (Name=Matches, Filename='@DatabaseFile') log on (Name=MatchesLog, Filename='@DatabaseLog')";
SqlCommand DatabaseCreationCommand = new SqlCommand(Str, MyConn);
DatabaseCreationCommand.Parameters.Add("@DatabaseFile", SqlDbType.Text).Value = DatabaseFile;
DatabaseCreationCommand.Parameters.Add("@DatabaseLog", SqlDbType.Text).Value = DatabaseLog;
try
{
MyConn.Open();
DatabaseCreationCommand.ExecuteNonQuery();
}
catch (SqlException S)
{
MessageBox.Show(S.Message);
return false;
}
catch (IOException I)
{
MessageBox.Show(I.Message);
return false;
}
catch (InvalidOperationException I)
{
MessageBox.Show(I.Message);
return false;
}
catch (InvalidCastException I)
{
MessageBox.Show(I.Message);
return false;
}
finally
{
MyConn.Close();
}
return true;
}
数据库删除例程:
public void DeleteDatabase()
{
string Str;
SqlConnection MyConn = new SqlConnection(CreateDatabaseConnectionString);
Str = "Alter database Matches set single_user with rollback immediate\r\ndrop database Matches";
SqlCommand command = new SqlCommand(Str, MyConn);
try
{
MyConn.Open();
command.ExecuteNonQuery();
}
catch (SqlException S)
{
MessageBox.Show(S.Message);
}
catch (IOException I)
{
MessageBox.Show(I.Message);
}
catch (InvalidOperationException I)
{
MessageBox.Show(I.Message);
}
catch (InvalidCastException I)
{
MessageBox.Show(I.Message);
}
finally
{
MyConn.Close();
}
}
解决方案
正如这里所说并由 Jeroen Mostert 确认,Create database
不接受查询。该数据库是之前创建的,使用了一些字符串连接。之后查询字符串被参数化,没有意识到这个命令不带参数。这就是为什么将创建数据库查询更改为
Create Database Matches
完美运行。
好吧,生活和学习!
推荐阅读
- java - Android 7.1如何清除通知栏的所有通知?
- css - 简单的旋转悬停效果不起作用
- c# - “从范围''引用''类型的变量'',但未定义”
- javascript - 如何让两个 js 函数一起工作?
- php - 如何使用 SOAP 1.2 和 WSDL 将 XML 作为请求发送给供应商并接收响应?
- sql - 如何在 SQL Server 2008 中创建存储过程?
- python - 如何在 python 中处理多个模块/包?
- python - 如何为带有噪声的图像获得正确的二维高斯拟合参数
- c++ - 将 std::array 与传统数组 C++ 进行比较
- amazon-web-services - aws lambda update-function-configuration 没有 --profile 选项?