C#SQL Server脚本更改数据库问题
我需要运行c#应用程序文件中的sql脚本。 问题是它创建对象并在不同的数据库上执行命令 在脚本中,每次需要更改当前数据库时,它都会使用命令C#SQL Server脚本更改数据库问题,c#,sql-server,enterprise-library,C#,Sql Server,Enterprise Library,我需要运行c#应用程序文件中的sql脚本。 问题是它创建对象并在不同的数据库上执行命令 在脚本中,每次需要更改当前数据库时,它都会使用命令 使用[databasename] 由于有许多对象创建,它多次使用命令GO,因此我一直在读取文件,直到找到一个GO命令并在数据库中运行该语句;到目前为止还不错,但是在命令运行之后,连接返回到默认数据库(本例中为master),忽略最后一个USE语句 这是我用来读取文件和执行脚本的代码 似乎在执行sp_reset_conction的每个ExecuteNonQue
使用[databasename]
由于有许多对象创建,它多次使用命令GO
,因此我一直在读取文件,直到找到一个GO命令并在数据库中运行该语句;到目前为止还不错,但是在命令运行之后,连接返回到默认数据库(本例中为master),忽略最后一个USE语句
这是我用来读取文件和执行脚本的代码
似乎在执行sp_reset_conction的每个ExecuteNonQuery命令后都会清除连接(这是我在探查器中得到的)
有什么优雅而简单的方法来完成这个吗
谢谢他的博客上有一篇关于测试工具和结果的文章。读起来好像他有一个和你描述的相似的问题
有两种方法可以做到这一点,你必须评估哪种方法最适合你,以及哪种方法是否有任何连锁效应
SqlConnection
并对其调用open()
,而不仅仅是用SqlDatabase
打开数据库李>
Connection Reset=False
。但是,我不知道这种方法的优缺点,所以不知道是否有任何副作用,因为我知道这会禁用连接池。在应用程序/实用程序的上下文中,您将比我更清楚SqlConnection
并对其调用open()
,而不仅仅是用SqlDatabase
打开数据库李>
Connection Reset=False
。但是,我不知道这种方法的优缺点,所以不知道是否有任何副作用,因为我知道这会禁用连接池。在应用程序/实用程序的上下文中,您将比我更清楚我建议阅读所有血淋淋的细节,然后做一点挖掘,看看哪一个最适合你。我会说解析出使用[数据库],并存储它。然后在所有查询字符串组合在一起后,将其添加到每个新查询字符串的开头。像这样:
using (StreamReader reader = new StreamReader(databaseScriptFile))
{
DatabaseFactory.CreateDatabase();
Database db = new SqlDatabase(connectionstring);
txbuilder = new StringBuilder();
bool lastExecute = true;
string useDB = "";
while (!reader.EndOfStream)
{
text = reader.ReadLine();
if (text.Substring(0, 3) == "USE")
{
useDB = text;
}
else if (text.Trim().ToUpper() != "GO")
{
lastExecute = false;
txbuilder.AppendLine(text);
}
else
{
lastExecute = true;
strQuery = useDB + txbuilder.ToString();
db.ExecuteNonQuery(CommandType.Text, strQuery);
txbuilder.Length = 0;
}
}
//Make sure that the last sentence is executed
if (!lastExecute)
db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString());
}
请注意,如果该行是USE[databasename],它会将其放入useDB中,而不会将其添加到txbuilder变量中。因此,每次“填充”txbuilder时,都会将useDB和它一起附加到strQuery中,然后运行查询。然后,每个查询都以“使用[databasename]”开头
而且,每次你使用一个新的用法,它都会切换到使用那个数据库。我会说,解析出用法[数据库],并存储它。然后在所有查询字符串组合在一起后,将其添加到每个新查询字符串的开头。像这样:
using (StreamReader reader = new StreamReader(databaseScriptFile))
{
DatabaseFactory.CreateDatabase();
Database db = new SqlDatabase(connectionstring);
txbuilder = new StringBuilder();
bool lastExecute = true;
string useDB = "";
while (!reader.EndOfStream)
{
text = reader.ReadLine();
if (text.Substring(0, 3) == "USE")
{
useDB = text;
}
else if (text.Trim().ToUpper() != "GO")
{
lastExecute = false;
txbuilder.AppendLine(text);
}
else
{
lastExecute = true;
strQuery = useDB + txbuilder.ToString();
db.ExecuteNonQuery(CommandType.Text, strQuery);
txbuilder.Length = 0;
}
}
//Make sure that the last sentence is executed
if (!lastExecute)
db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString());
}
请注意,如果该行是USE[databasename],它会将其放入useDB中,而不会将其添加到txbuilder变量中。因此,每次“填充”txbuilder时,都会将useDB和它一起附加到strQuery中,然后运行查询。然后,每个查询都以“使用[databasename]”开头
此外,每次您使用新的数据库时,它都会切换到使用该数据库。这与“企业库”有什么关系?我使用企业库的数据库对象来运行脚本这与“企业库”有什么关系?我使用企业库的数据库对象来运行脚本