C# 执行ini文件中指定的.sql文件

dongzhen398 2014-07-21 02:54:31
[Execute SQL]
;;-------------------------------------------------------------------------------------
;; データベースの作成
;;-------------------------------------------------------------------------------------
Message = "データベースの作成をしています。(%DBName%)"
SQLCMD = /d %DBName% /i E:\InstallDatabase\00Database\%DBFolder%\*.sql
;;-------------------------------------------------------------------------------------
;; ログインユーザの作成
;;-------------------------------------------------------------------------------------
Message = "ログインユーザを作成しています。"
SQLCMD = /d master /i E:\InstallDatabase\99Configure\10_LoginUser\*.sql
;;-------------------------------------------------------------------------------------
;; データベースユーザの作成
;;-------------------------------------------------------------------------------------
Message = "データベースユーザを作成しています。"
SQLCMD = /d master /i E:\InstallDatabase\99Configure\20_DatabaseUser\*.sql




请问各位大神 我该如何执行上述ini文件中的SQLCMD所指定的*.sql文件呢 特别着急 辛苦各位大神了
...全文
206 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongzhen398 2014-07-24
  • 打赏
  • 举报
回复
看来是没有人能帮助我了
道玄希言 2014-07-24
  • 打赏
  • 举报
回复

        //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
        public StringCollection ReadSection(string Section)
        {
            Byte[] Buffer = new Byte[16384];
            StringCollection Idents = new StringCollection();
            //Idents.Clear();
            int bufLen = GetPrivateProfileString(Section, null, null, Buffer, Buffer.GetUpperBound(0),
             FileName);
            //对Section进行解析
            GetStringsFromBuffer(Buffer, bufLen, Idents);
            return Idents;
        }
        private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)
        {
            Strings.Clear();
            if (bufLen != 0)
            {
                int start = 0;
                for (int i = 0; i < bufLen; i++)
                {
                    if ((Buffer[i] == 0) && ((i - start) > 0))
                    {
                        String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start);
                        Strings.Add(s);
                        start = i + 1;
                    }
                }
            }
        }

        //从Ini文件中,读取所有的Sections的名称
        public StringCollection ReadSections()
        {
            StringCollection SectionList = new StringCollection();
            //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section
            byte[] Buffer = new byte[65535];
            int bufLen = 0;
            bufLen = GetPrivateProfileString(null, null, null, Buffer,
             Buffer.GetUpperBound(0), FileName);
            GetStringsFromBuffer(Buffer, bufLen, SectionList);
            return SectionList;
        }
        //读取指定的Section的所有Value到列表中
        public NameValueCollection ReadSectionValues(string Section)
        {
            NameValueCollection Values = new NameValueCollection();
            StringCollection KeyList = ReadSection(Section);
            Values.Clear();
            foreach (string key in KeyList)
            {
                Values.Add(key, ReadString(Section, key, ""));
            }
            return Values;
        }
        //清除某个Section
        public void EraseSection(string Section)
        {
            //
            if (!WritePrivateProfileString(Section, null, null, FileName))
            {
                throw (new ApplicationException("无法清除Ini文件中的Section"));
            }
        }
        //删除某个Section下的键
        public void DeleteSectionKey(string Section, string Ident)
        {
            WritePrivateProfileString(Section, Ident, null, FileName);
        }
        /// <summary>
        /// Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
        /// </summary>
        ///Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
        ///在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
        ///执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。
        public void UpdateFile()
        {
            WritePrivateProfileString(null, null, null, FileName);
        }
        /// <summary>
        /// 检查某个Section是否存在。
        /// </summary>
        /// <param name="Section">小节名</param>
        /// <returns>存在返回true,否则为false。</returns>
        public bool SectionExists(string Section)
        {
            StringCollection Sections = this.ReadSections();
            return Sections.IndexOf(Section) > -1;
        }
        /// <summary>
        /// 检查某个Section的某个键值是否存在。
        /// </summary>
        /// <param name="Section">小节名</param>
        /// <param name="Ident">关键字</param>
        /// <returns>存在返回true,否则为false。</returns>
        public bool ValueExists(string Section, string Ident)
        {
            //
            StringCollection Idents = ReadSection(Section);
            return Idents.IndexOf(Ident) > -1;
        }
        //确保资源的释放   */
        ~inifile()
        {
            UpdateFile();
        }
    }
}
然后,调用:

string  SQLStr = ReadiniFile("Execute SQL", "SQLCMD", "");
有点疑问,你这个是INI文件么? INI文件相同小节中,字段名称怎么可能会相同呢? 正常INI文件也应该这么写啊: [Execute SQL1] ;;------------------------------------------------------------------------------------- ;; データベースの作成 ;;------------------------------------------------------------------------------------- Message = "データベースの作成をしています。(%DBName%)" SQLCMD = /d %DBName% /i E:\InstallDatabase\00Database\%DBFolder%\*.sql ;;------------------------------------------------------------------------------------- [Execute SQL2] ;; ログインユーザの作成 ;;------------------------------------------------------------------------------------- Message = "ログインユーザを作成しています。" SQLCMD = /d master /i E:\InstallDatabase\99Configure\10_LoginUser\*.sql ;;------------------------------------------------------------------------------------- [Execute SQL3] ;; データベースユーザの作成 ;;------------------------------------------------------------------------------------- Message = "データベースユーザを作成しています。" SQLCMD = /d master /i E:\InstallDatabase\99Configure\20_DatabaseUser\*.sql
道玄希言 2014-07-24
  • 打赏
  • 举报
回复
你已经做好读取INI文件的模块了么? 就是向DELPHI那样的,简单的读取ini文件指定 小节, 指定字段的值 等 这个你如果做好了,不就简单了。 看你说的,估计,你连INI文件解析都没解析出来吧 解析INI文件

using System;
using System.Collections.Specialized;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using nv.lib.invlib;

namespace nv.lib.inifiles
{
    /// <summary>
    /// 使用建议:虽然支持中文,但建议在ini文件中尽量避免使用中文,以避免在不同的操作系统产生不可预料的错误。
    /// 一个模仿Delphi的TIniFile的类
    /// </summary>
    public class inifile
    {
        public string FileName; //INI文件名

        #region Dll Import
        /// <summary>
        /// 声明读写INI文件的API函数
        /// </summary>
        /// <param name="section"></param>
        /// <param name="key"></param>
        /// <param name="val"></param>
        /// <param name="filePath"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll",EntryPoint="WritePrivateProfileString")]
        private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]
        private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
        
        #endregion
        

        /// <summary>
        /// 构造函数。
        /// 当指定的INI文件不存在时可选是否建立或抛出异常。
        /// </summary>
        /// <param name="IniFileName">文件名</param>
        /// <param name="ForceCreate">当文件不存在时是否建立</param>
        public inifile(string IniFileName, bool ForceCreate)  
        {
            // 判断文件是否存在
            FileInfo fileInfo = new FileInfo(IniFileName);
            if ((!fileInfo.Exists)) 
                if (!ForceCreate)
                {
                    throw (new ApplicationException("Ini文件不存在"));
                }
                else
                {
                    fileInfo.Directory.Create();
                    fileInfo.Create();
                }
            //必须是完全路径,不能是相对路径
            FileName = fileInfo.FullName;
        }
        

        #region 各种数据类型的读写
        /// <summary>
        /// 将各种类型的值写入ini。
        /// (string字符串,int整型,float单精度型,double双精度型,bool布尔型,DateTime日期型)
        /// </summary>
        /// <param name="Section">小节名</param>
        /// <param name="Ident">关键字</param>
        /// <param name="Value">要写入的值</param>
        private void WriteString(string Section, string Ident, string Value)
        {
            if (!WritePrivateProfileString(Section, Ident, Value, FileName))
            {
                // Todo:抛出自定义的异常
                throw (new ApplicationException("写Ini文件出错"));
            }
        }
        public void WriteIniFile(string Section, string Ident, string Value)//字符串
        {
            WriteString(Section, Ident, Value);
        }
        public void WriteIniFile(string Section, string Ident, int Value)//整型
        {
            WriteString(Section, Ident, Value.ToString());
        }
        public void WriteIniFile(string Section, string Ident, bool Value)//布尔型
        {
            WriteString(Section, Ident, Value.ToString());
        }
        public void WriteIniFile(string Section, string Ident, DateTime Value)//日期型
        {
            WriteString(Section, Ident, Value.ToString());
        }
        public void WriteDouble(string Section, string Ident, float Value)//单精度型
        {
            WriteString(Section, Ident, Value.ToString());
        }
        public void WriteDouble(string Section, string Ident, double Value)//双精度型
        {
            WriteString(Section, Ident, Value.ToString());
        }

        /// <summary>
        /// 从ini文件中读取各种类型的值。
        /// (string字符串,int整型,float单精度型,double双精度型,bool布尔型,DateTime日期型)
        /// 当读取失败时返回缺省值。
        /// </summary>
        /// <param name="Section">小节名</param>
        /// <param name="Ident">关键字</param>
        /// <param name="Default">缺省值</param>
        /// <returns>string型值</returns>
        private string ReadString(string Section, string Ident, string Default)
        {
            //StringBuilder Buffer = new StringBuilder(255);
            Byte[] Buffer = new Byte[65535];
            int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
            //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文
            string s = Encoding.GetEncoding(0).GetString(Buffer);
            s = s.Substring(0, bufLen);
            return s.Trim();
        }
        public string ReadIniFile(string Section, string Key, string Default) //读INI文件<字符串>       
        {
            return ReadString(Section, Key, Default);
        }
        public int ReadIniFile(string Section, string Ident, int Default) //读INI文件<整型>
        {
            string intStr = ReadString(Section, Ident, Default.ToString());
            try
            {
                return Convert.ToInt32(intStr);
            }
            catch (Exception)
            {
                //Console.WriteLine(ex.Message);
                return Default;
            }
        }
        public bool ReadIniFile(string Section, string Ident, bool Default) //读INI文件<布尔型>
        {
            try
            {
                return Convert.ToBoolean(ReadString(Section, Ident, Default.ToString()));
            }
            catch (Exception)
            {
                //Console.WriteLine(ex.Message);
                return Default;
            }
        }
        public DateTime ReadIniFile(string Section, string Ident, DateTime Default) //读INI文件<日期型>
        {
            try
            {
                return Convert.ToDateTime(ReadString(Section, Ident, Default.ToString()));
            }
            catch (Exception)
            {
                return Default;
            }
        }
        public double ReadIniFile(string Section, string Ident, float Default) //读INI文件<单精度型>
        {
            try
            {
                return Convert.ToDouble(ReadString(Section, Ident, Default.ToString()));
            }
            catch (Exception)
            {
                return Default;
            }
        }
        public double ReadIniFile(string Section, string Ident, double Default) //读INI文件<双精度型>
        {
            try
            {
                return Convert.ToDouble(ReadString(Section, Ident, Default.ToString()));
            }
            catch (Exception)
            {
                return Default;
            }
        }
        #endregion
GT7466 2014-07-22
  • 打赏
  • 举报
回复
引用 4 楼 dongzhen398 的回复:
[quote=引用 2 楼 GT7466 的回复:] 【1】读取ini文件,取得SQLCMD值 【2】根据路径循环读取文件夹下所有.sql文件内容 【3】执行sql
第一步骤已经实现了 你可不可以写一些伪代码告诉我一下大体思路? 最主要的是如何执行sql 用什么方法 你说的这几步骤太概括了 其实我们也是这个思路 [/quote] 每个*.sql里面是一系列的命令还是特定的一个命令? 看你SQLCMD的信息,先推测是一个*.sql文件里只有一个特定命令,那你的疑问就是如何区别select,create,update等类型的问题。通过sql文本来自动分析是那种命令我觉得是复杂化了,看你列出的几个SQLCMD,我觉得是有一个已经定义好的列表或者叫枚举值的,比如:DBFolder代表数据库文件路径,10_LoginUser代表用户登录--其中的10尤其可疑是种编码序列。 如果你取得这些信息,那执行具体的那个命名函数就不成问题了。
dongzhen398 2014-07-22
  • 打赏
  • 举报
回复
引用 12 楼 dongzhen398 的回复:
[quote=引用 9 楼 forcyever 的回复:] [quote=引用 8 楼 dongzhen398 的回复:] [quote=引用 6 楼 forcyever 的回复:] http://www.codesky.net/article/200506/69355.html
这个方法不太行,我上面的例子你应该看到了 ,我们执行这个sql的时候 还需要传递参数的[/quote] 你哪有例子说你执行SQL文件传参数了?[/quote] SQLCMD = /d %DBName% /i E:\InstallDatabase\00Database\%DBFolder%\*.sql %DBName% %DBFolder%这两个就是参数。 我说的时候有点没说明白 sorry[/quote] 参数这个无所谓了 我自己通过传递可以拼凑 但是你的那个方法 无法执行SQLCMD语句 只能执行指定路径下的SQL文件
dongzhen398 2014-07-22
  • 打赏
  • 举报
回复
引用 10 楼 forcyever 的回复:
我找的这个是执行.sql文件,你遍历INI文件,获取.sql文件路径,调用上面链接中的方法不就行了
SQLCMD = /d %DBName% /i E:\InstallDatabase\00Database\%DBFolder%\*.sql 我要执行的是SQLCMD语句 你的那个方法 只能执行 E:\InstallDatabase\00Database\%DBFolder%\*.sql这个语句吧 前面的/d %DBName% /i 是无法执行的把 我是这样理解的
dongzhen398 2014-07-22
  • 打赏
  • 举报
回复
引用 9 楼 forcyever 的回复:
[quote=引用 8 楼 dongzhen398 的回复:] [quote=引用 6 楼 forcyever 的回复:] http://www.codesky.net/article/200506/69355.html
这个方法不太行,我上面的例子你应该看到了 ,我们执行这个sql的时候 还需要传递参数的[/quote] 你哪有例子说你执行SQL文件传参数了?[/quote] SQLCMD = /d %DBName% /i E:\InstallDatabase\00Database\%DBFolder%\*.sql %DBName% %DBFolder%这两个就是参数。 我说的时候有点没说明白 sorry
平头哥哥 2014-07-22
  • 打赏
  • 举报
回复
读取 INI 文件 获取 SQL 路径 执行 即可。 根据你的 问题 这个便是回答
forcyever 2014-07-22
  • 打赏
  • 举报
回复
我找的这个是执行.sql文件,你遍历INI文件,获取.sql文件路径,调用上面链接中的方法不就行了
forcyever 2014-07-22
  • 打赏
  • 举报
回复
引用 8 楼 dongzhen398 的回复:
[quote=引用 6 楼 forcyever 的回复:] http://www.codesky.net/article/200506/69355.html
这个方法不太行,我上面的例子你应该看到了 ,我们执行这个sql的时候 还需要传递参数的[/quote] 你哪有例子说你执行SQL文件传参数了?
dongzhen398 2014-07-22
  • 打赏
  • 举报
回复
引用 6 楼 forcyever 的回复:
http://www.codesky.net/article/200506/69355.html
这个方法不太行,我上面的例子你应该看到了 ,我们执行这个sql的时候 还需要传递参数的
forcyever 2014-07-22
  • 打赏
  • 举报
回复
引用 6 楼 forcyever 的回复:
http://www.codesky.net/article/200506/69355.html
C# 执行.sql文件
dongzhen398 2014-07-22
  • 打赏
  • 举报
回复
引用 3 楼 wangnaisheng 的回复:
C#如何读写和创建INI文件
网上有好多的 一搜有的是
dongzhen398 2014-07-22
  • 打赏
  • 举报
回复
引用 2 楼 GT7466 的回复:
【1】读取ini文件,取得SQLCMD值 【2】根据路径循环读取文件夹下所有.sql文件内容 【3】执行sql
第一步骤已经实现了 你可不可以写一些伪代码告诉我一下大体思路? 最主要的是如何执行sql 用什么方法 你说的这几步骤太概括了 其实我们也是这个思路
wangnaisheng 2014-07-21
  • 打赏
  • 举报
回复
GT7466 2014-07-21
  • 打赏
  • 举报
回复
【1】读取ini文件,取得SQLCMD值 【2】根据路径循环读取文件夹下所有.sql文件内容 【3】执行sql
dongzhen398 2014-07-21
  • 打赏
  • 举报
回复
各位大神帮帮忙啊 小弟十分着急 求求各位了

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧