C# 从SQL文件构建数据库

C# 从SQL文件构建数据库,c#,sql,sql-server-ce,build-process,C#,Sql,Sql Server Ce,Build Process,这是针对数据库课程中的一个项目,所以我尝试先避免像EF代码这样的东西,让我假装数据库实际上不存在,数据只是神奇地持续存在 基本上,作为项目中的构建步骤,我希望能够从SQL脚本中拆除并重新构建本地SQL Server CE数据库。我正在使用VS2012 express,它是一个WPF项目。理想情况下,项目中可以从IDE看到一个SQL文件夹,其中包含按顺序运行的脚本 我所能找到的只是帮助您避免编写SQL的工具。有什么建议吗?您可以编写一些C代码,读取目标文件夹的内容并对数据库执行(使用纯、简单的Sq

这是针对数据库课程中的一个项目,所以我尝试先避免像EF代码这样的东西,让我假装数据库实际上不存在,数据只是神奇地持续存在

基本上,作为项目中的构建步骤,我希望能够从SQL脚本中拆除并重新构建本地SQL Server CE数据库。我正在使用VS2012 express,它是一个WPF项目。理想情况下,项目中可以从IDE看到一个SQL文件夹,其中包含按顺序运行的脚本

我所能找到的只是帮助您避免编写SQL的工具。有什么建议吗?

您可以编写一些C代码,读取目标文件夹的内容并对数据库执行(使用纯、简单的SqlCommands),然后将此代码放入MSBuild
任务
,并将其添加到
csproj
后构建
目标中


编辑:更好的是,使用预先存在的MSBuild包(如此包)为您执行sql

或者,您可以将SQL文件的内容(一次一个)读入字符串,并使用简单的ADO.Net调用对DB以编程方式执行它们

您可以使用以下内容:

    /// <summary>
    /// This method internally uses the ExecuteNonQuery method of the SqlCommand object
    /// to run a query that returns no values (updates/inserts/deletes).
    /// </summary>
    /// <param name="sql">The SQL to execute</param>
    /// <param name="parameters">The SqlParameters to use (pass null if there are none)</param>
    /// <remarks>This method is thread safe.</remarks>
    public static void runNonQuery(string sql, IList<SqlParameter> parameters, string dbConnectionString)
    {
        // Old-school, using simple ADO.Net to run a non-query (updates/inserts/deletes) - KDR
        try
        {
            Monitor.Enter(_lock);
            using (SqlConnection conn = new SqlConnection(dbConnectionString))
            {
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
                {
                    conn.Open();
                    cmd.Connection = conn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = sql;

                    if (parameters != null && parameters.Count() != 0)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                    }
                    cmd.ExecuteNonQuery();
                }
                if (conn.State != ConnectionState.Closed) { conn.Close(); }
            }
        }
        finally
        {
            Monitor.Exit(_lock);
        }
    }
//
///此方法在内部使用SqlCommand对象的ExecuteOnQuery方法
///运行不返回值的查询(更新/插入/删除)。
/// 
///要执行的SQL语句
///要使用的SqlParameters(如果没有,则传递null)
///此方法是线程安全的。
公共静态void runNonQuery(字符串sql、IList参数、字符串dbConnectionString)
{
//老式,使用简单的ADO.Net运行非查询(更新/插入/删除)-KDR
尝试
{
监视器。输入(_lock);
使用(SqlConnection conn=newsqlconnection(dbConnectionString))
{
使用(System.Data.SqlClient.SqlCommand cmd=new System.Data.SqlClient.SqlCommand())
{
conn.Open();
cmd.Connection=conn;
cmd.CommandType=CommandType.Text;
cmd.CommandText=sql;
if(parameters!=null&¶meters.Count()!=0)
{
foreach(参数中的SqlParameter参数)
{
cmd.Parameters.Add(param);
}
}
cmd.ExecuteNonQuery();
}
如果(conn.State!=ConnectionState.Closed){conn.Close();}
}
}
最后
{
监视器。退出(_锁定);
}
}
只需在字符串SQL中传递SQL脚本文件的内容,在参数列表中传递null,然后在dbConnectionString中将连接字符串传递到数据库。

sqlcmd.exe(命令行实用程序)不适用于SQL Server CE。
(如果您使用的是完整版Sql Server(或Sql Server Express),我将从sqlcmd.exe开始。)

因此,这里有一个想法(也许)让你开始使用CE。请参阅下面的URL


我现在正试图实现一个MSBuild
任务
——但是SqlCmd扩展显然不适用于CE数据库。