现在的位置: 首页 > 综合 > 正文

关于在.net中动态创建数据库(包括表,视图。。。)有参考别人的代码。。。

2012年11月29日 ⁄ 综合 ⁄ 共 3327字 ⁄ 字号 评论关闭

     最近因为需要需要做一个动态生成数据库的东西,很是头大,不过后来参考了一些文章,然后拼凑最后做出来的。。。

 

     先占代码先。。

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Collections;
using System.IO;

public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (execfile())
{
Response.Write("Success");
string constr = "Data Source=.;Initial Catalog=SqlTest111;Integrated Security=True"; // 定义链接字符窜
SqlConnection conn = new SqlConnection(constr);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
ArrayList Lists = Default2.ExecuteSqlFile(Server.MapPath("script.sql")); //调用ExecuteSqlFile()方法,反回 ArrayList对象;
string teststr; //定义遍历ArrayList 的变量;
foreach (string varcommandText in Lists)
{
teststr = varcommandText; //遍历并符值;
//Response.Write(teststr + "|@|<br>");
cmd.CommandText = teststr; //为SqlCommand赋Sql语句;
cmd.ExecuteNonQuery(); //执行
}
ArrayList Listssss = Default2.ExecuteSqlFile(Server.MapPath("script111.sql")); //调用ExecuteSqlFile()方法,反回 ArrayList对象;
//定义遍历ArrayList 的变量;
foreach (string varcommandText in Listssss)
{
teststr = varcommandText; //遍历并符值;
//Response.Write(teststr + "|@|<br>");
cmd.CommandText = teststr; //为SqlCommand赋Sql语句;
cmd.ExecuteNonQuery(); //执行
}
conn.Close();
}
}
}
/// <summary>
/// 创建连接起用进程建立数据库
/// </summary>
/// <returns></returns>
private bool execfile()
{
try
{
string connStr = "data source=.;user id=sa;password=123;persist security info=false;packet size=4096";
ExecuteSql(connStr, "master", "CREATE DATABASE" + " SqlTest111");//调用ExecuteNonQuery()来创建数据库
System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();//创建一个进程
sqlProcess.StartInfo.FileName = "osql.exe";//OSQL基于ODBC驱动连接服务器的一个实用工具(可查阅SQL帮助手册)
//string str = @"C:\Program Files\Microsoft SQL Server\MSSQL\Data";
sqlProcess.StartInfo.Arguments = " -U sa -P sa -d SqlTest -i C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data";//获取启动程序时的参数
sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//调用进程的窗口状态,隐藏为后台
sqlProcess.Start();
sqlProcess.WaitForExit();
sqlProcess.Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 创建数据库,调用ExecuteNonQuery()执行
/// </summary>
/// <param name="conn"></param>
/// <param name="DatabaseName"></param>
/// <param name="Sql"></param>
private void ExecuteSql(string conn, string DatabaseName, string Sql)
{
System.Data.SqlClient.SqlConnection mySqlConnection = new System.Data.SqlClient.SqlConnection(conn);
System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql, mySqlConnection);
Command.Connection.Open();
Command.Connection.ChangeDatabase(DatabaseName);
try
{
Command.ExecuteNonQuery();
}
finally
{
Command.Connection.Close();
}
}

public static ArrayList ExecuteSqlFile(string varFileName)
{
//
// TODO:读取.sql脚本文件
//
StreamReader sr = File.OpenText(varFileName);//传入的是文件路径及完整的文件名
ArrayList alSql = new ArrayList(); //每读取一条语名存入ArrayList
string commandText = "";
string varLine = "";
while (sr.Peek() > -1)
{
varLine = sr.ReadLine();
if (varLine == "")
{
continue;
}
if (varLine != "GO")
{
commandText += varLine;
commandText += " ";
}
else
{
alSql.Add(commandText);
commandText = "";
}
}

sr.Close();
return alSql;
}
}

里面的script.sql文件是在数据库中点击生成脚本,生成完成后,将文件拷到项目里面来。。。还有这个文件里面是视图。。。

 

PS:需要注意的就是,因为在创建数据库的过程中,必须得先建数据库,在建表,在建视图。。等等,所以在生成脚本的时候有时会吧所有的东西都生成到一块去,需要做的就是把里面的表和视图。。分开到不同的***.SQL文件中去,按照顺序创建。。。这样就可以了。。。完。。。。

抱歉!评论已关闭.