我有一个.sql文件,其中包含与sql server 2008相关的数据库脚本,我想执行它来操作我的数据库。我希望将这个过程自动化,而不是手动操作。对我来说,有三种可用的选项:批处理文件、PowerShell或C#。我如何执行这个脚本,将会受到我的下一个问题的影响 - 如果脚本由于任何原因无法执行,我想在程序中得到通知。这将成为一组常规安装步骤的一部分,所以如果脚本不能正确地执行,我希望安装程序停止运行。
我有一个.sql文件,其中包含与sql server 2008相关的数据库脚本,我想执行它来操作我的数据库。我希望将这个过程自动化,而不是手动操作。对我来说,有三种可用的选项:批处理文件、PowerShell或C#。我如何执行这个脚本,将会受到我的下一个问题的影响 - 如果脚本由于任何原因无法执行,我想在程序中得到通知。这将成为一组常规安装步骤的一部分,所以如果脚本不能正确地执行,我希望安装程序停止运行。
将其作为 SQL 代理作业运行,您可以设置 SQL 代理以在脚本失败时向您发送警报。
sp_add_job
等来创建。 - BenC#代码
using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) {
con.Open();
SqlCommand cmd = new SqlCommand();
string expression = "Parameter value";
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Your Stored Procedure";
cmd.Parameters.Add("Your Parameter Name", SqlDbType.VarChar).Value = expression;
cmd.Connection = con;
using (IDataReader dr = cmd.ExecuteReader()) {
if (dr.Read()) {
}
}
}
You can find below mentioned events for the installer process.
1. Install
2. Commit
3. Rollback
4. UNInstall
我认为批处理更容易(但这是个人偏好)
runsqlscr.cmd
@echo off
REM :: building your script below, not needed if already created
REM echo Select * from PutTableHere where > %temp%\tmpsql.sql
REM echo "put rest of sql script here one line at a time" >> %temp%\tmpsql.sql
REM echo go >> %temp%\tmpsql.sql
REM echo.
REM echo script written
REM echo.
REM echo ready to execute script
REM :: delete pause if needed
REM pause
REM :: the actual command needed in script
REM sqlcmd -U thedbuser -P thepasswd -d thedbname -o resultsofscript.txt < %temp%\tmpsql.sql
REM echo All done, displaying results
REM type resultofscript.txt
REM echo.
如果脚本已经构建完成,您可以跳过脚本的构建,只需将%temp%tmpsql.sql更改为您脚本的位置和名称即可。
在sqlcmd行中,您需要输入自己的“the*”值。
以上内容仅供测试使用,您的安装脚本所需的仅是sqlcmd行。
祝批处理愉快
private void button1_Click(object sender, EventArgs e)
{
ServerConnection connection = new ServerConnection("stjepan-lap");
connection.LoginSecure = true;
Server server = new Server(connection);
server.ConnectionContext.InfoMessage += new SqlInfoMessageEventHandler(ConnectionContext_InfoMessage);
server.ConnectionContext.StatementExecuted += new StatementEventHandler(ConnectionContext_StatementExecuted);
server.ConnectionContext.ServerMessage += new ServerMessageEventHandler(ConnectionContext_ServerMessage);
//Executes T-Sql script
try
{
server.ConnectionContext.ExecuteNonQuery(textBox1.Text);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
if (ex.InnerException != null)
Debug.WriteLine(ex.InnerException.Message);
}
server.ConnectionContext.Disconnect();
}
void ConnectionContext_ServerMessage(object sender, ServerMessageEventArgs e)
{
Debug.WriteLine(e.Error);
}
void ConnectionContext_StatementExecuted(object sender, StatementEventArgs e)
{
Debug.WriteLine(e.SqlStatement);
}
void ConnectionContext_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
Debug.WriteLine(e.Message);
}
你应该引用SMO dll文件并在代码文件中放置适当的using语句
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Management.Sdk.Sfc.dll
....
using System;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
你也可以将这个打包到存储过程中,并在那里使用一些错误处理。