技术文章 > WinForm > C# 中直接执行sql文件

第一种方法

最简单的方法就是调用 osql.exe .

具体方法如下(以sql server200 数据库为例):

            try
            {
                System.Diagnostics.Process pr = new System.Diagnostics.Process();
                pr.StartInfo.FileName = "osql.exe ";
                pr.StartInfo.Arguments = "-U sa -P sa -d master -s 127.0.0.1 -i Sql.sql";
                pr.StartInfo.UseShellExecute = false;
                pr.StartInfo.RedirectStandardOutput = true;  //重定向输出
            
                pr.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//隐藏输出窗口
                pr.Start();
               
                System.IO.StreamReader sr = pr.StandardOutput;
                Console.WriteLine(sr.ReadToEnd());
  
                pr.WaitForExit();
                pr.Close();
            }
            catch(Exception err)
            {
                MessageBox.Show(err.ToString());
            }

以下是osql的一些参数用法:

用法: osql                   [-U 登录 ID]          [-P 密码]
  [-S 服务器]                [-H 主机名]           [-E 可信连接]
  [-d 使用数据库名称]        [-l 登录超时值]       [-t 查询超时值]
  [-h 标题]                  [-s 列分隔符]         [-w 列宽]
  [-a 数据包大小]            [-e 回显输入]         [-I 允许带引号的标识符]
  [-L 列出服务器]            [-c 命令结束]         [-D ODBC DSN 名称]
  [-q "命令行查询"]          [-Q "命令行查询" 并退出]
  [-n 删除编号方式]          [-m 错误级别]
  [-r 发送到 stderr 的消息]  [-V 严重级别]
  [-i 输入文件]              [-o 输出文件]
  [-p 打印统计信息]               [-b 出错时中止批处理]
  [-X[1] 禁用命令,[退出的同时显示警告]]
  [-O 使用旧 ISQL 行为禁用下列项]

 

第二种方法

先要添加sqldmo COM组件      

 COM 引用 "Microsoft  SQLDMO Object Library"

            SQLDMO.SQLServer2 sqlserver = new SQLDMO.SQLServer2Class();
            sqlserver.Connect("192.168.100.240", "sa", "1234");
            SQLDMO.Databases mydbs = sqlserver.Databases;
            SQLDMO.Database mydb = new SQLDMO.DatabaseClass();
            mydb = (SQLDMO.Database)mydbs.Item("master", "sa");
            System.IO.StreamReader s = new System.IO.StreamReader(this.textBox1.Text);
            string sql = s.ReadToEnd();
            mydb.ExecuteImmediate(sql, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default, sql.Length);

 

如果是建立数据库:见如下代码

SqlConnection conn=new SqlConnection("server=(local);user=sa;pwd=;database=master");
SqlCommand cmd=new SqlCommand("CREATE DATABASE [我的数据库] COLLATE Chinese_PRC_CI_AS;",conn);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();

 

        #region  這段代碼只能執行<沒有GO的.SQL文件>
        private string GetSql(string Name)
        {
            try
            {
                Assembly Asm = Assembly.GetExecutingAssembly();
                Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);
                StreamReader reader = new StreamReader(strm);
                return reader.ReadToEnd();
            }
            catch (Exception ex)
            {
                Console.Write("In GetSql:" + ex.Message);
                throw ex;
            }
        }
        private void ExecuteSql(string DataBaseName, string Sql)
        {
            System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClient.SqlConnection ("Password=1234;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=192.168.100.240");
            System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,conn);

            Command.Connection.Open();
            Command.Connection.ChangeDatabase(DataBaseName);
            try
            {
                Command.ExecuteNonQuery();
            }
            finally
            {
                Command.Connection.Close();
            }
        }

 

        ///   <summary>  
        ///   分析msSqlServer文件*.sql  
        ///   </summary>  
        ///   <param   name="m_SqlFilePath">文件路径</param>  
        ///   <returns></returns>  
        private string GetExcuteSql(string m_SqlFilePath)
        {
            string m_ReturnStr = "";
            StreamReader sr = File.OpenText(m_SqlFilePath);
            //string s = sr.ReadLine();
            string sa = sr.ReadToEnd();
            StringBuilder sb = new StringBuilder();
            //while (s != null)
            //{

            //    if (s.Replace("   ", "") == "GO")
            //        sb.Append(";");
            //    else
            //        sb.Append(s+"  ");
            //    s = sr.ReadLine();
            //}
            m_ReturnStr = sb.ToString();
            sr.Close();
            //return m_ReturnStr;
            return sa;
        }
        #endregion

        private void Button1_Click(object sender, EventArgs e)
        {
          //ExecuteSql(strDBName, GetSql("sql.txt"));
          //ExecuteSql("master", GetSql(this.textBox1.Text));
          //ExecuteSql("master", GetExcuteSql(this.textBox1.Text));
            this.ExecSqlFile();
        }

 

 

发表于 2009-4-27 19:35:15 | By 阅读(835)

文章评论列表

发表评论

验证码(必填)  
姓名
内容  

Top