您的位置:首页 > 数据库

在.NET 2.0框架下动态创建Access数据库和表时的注意事项 (zz)

2012-08-10 19:28 351 查看
在.NET 2.0框架下动态创建Access数据库和表时的注意事项

//z 2012-08-10 19:33:37 IS2120@csdn.T2247216201[T74,L793,R28,V696]

在以前的文章《如何在.NET框架下创建Access数据库和表?》中提供的方法,在.NET
2.0下无效,所有的字段类型都变成了文本类型,不知道微软改变了什么东西。提醒大家注意,需要加ADOX.ColumnClass.Type = DataTypeEnum.adLongVarBinary属性。下面将修正后的代码发布如下。
C#:

<%@ Page Language="C#" %>

<%@ Import Namespace="ADOX" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

/// <summary>

/// CreateAccessDB 的摘要说明。

/// 对于不同版本的ADO,需要添加不同的引用

/// 请添加引用Microsoft ADO Ext. 2.7 for DDL and Security

/// 请添加引用Microsoft ADO Ext. 2.8 for DDL and Security

/// </summary>

protected void Page_Load(object sender, EventArgs e)

{

//为了方便测试,数据库名字采用比较随机的名字,以防止添加不成功时还需要重新启动IIS来删除数据库。

string dbName = "D:NewMDB" + DateTime.Now.Millisecond.ToString() + ".mdb";

ADOX.CatalogClass cat = new ADOX.CatalogClass();

cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName + ";");

Response.Write("数据库:" + dbName + "已经创建成功!");

ADOX.TableClass tbl = new ADOX.TableClass();

tbl.ParentCatalog = cat;

tbl.Name = "MyTable";

//增加一个自动增长的字段

ADOX.ColumnClass col = new ADOX.ColumnClass();

col.ParentCatalog = cat;

col.Type = ADOX.DataTypeEnum.adInteger; // 必须先设置字段类型

col.Name = "id";

col.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

col.Properties["AutoIncrement"].Value = true;

tbl.Columns.Append(col, ADOX.DataTypeEnum.adInteger, 0);

//增加一个文本字段

ADOX.ColumnClass col2 = new ADOX.ColumnClass();

col2.ParentCatalog = cat;

col2.Name = "Description";

col2.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

tbl.Columns.Append(col2, ADOX.DataTypeEnum.adVarChar, 25);

//增加数字字段

ADOX.ColumnClass col3 = new ADOX.ColumnClass();

col3.ParentCatalog = cat;

col3.Name = "数字";

col3.Type = DataTypeEnum.adDouble;

col3.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

tbl.Columns.Append(col3, ADOX.DataTypeEnum.adDouble, 666);

//增加Ole字段

ADOX.ColumnClass col4 = new ADOX.ColumnClass();

col4.ParentCatalog = cat;

col4.Name = "Ole类型";

col4.Type = DataTypeEnum.adLongVarBinary;

col4.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

tbl.Columns.Append(col4, ADOX.DataTypeEnum.adLongVarBinary, 0);

//设置主键

tbl.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "id", "", "");

cat.Tables.Append(tbl);

msg.Text = ("<br>数据库表:" + tbl.Name + "已经创建成功!");

System.Runtime.InteropServices.Marshal.ReleaseComObject(tbl);

System.Runtime.InteropServices.Marshal.ReleaseComObject(cat);

tbl = null;

cat = null;

GC.WaitForPendingFinalizers();

GC.Collect();

}

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>在.NET框架下动态创建Access数据库和表</title>

</head>

<body>

<form id="form1" runat="server">

<asp:Label ID="msg" runat="server" />

</form>

</body>

</html>

VB.NET:

<%@ Page Language="VB" %>

<%@ Import Namespace="ADOX" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

Dim dbName As String = "D:NewMDB" + DateTime.Now.Millisecond.ToString + ".mdb"

Dim cat As ADOX.CatalogClass = New ADOX.CatalogClass

cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName + ";")

Response.Write("数据库:" + dbName + "已经创建成功!")

Dim tbl As ADOX.TableClass = New ADOX.TableClass

tbl.ParentCatalog = cat

tbl.Name = "MyTable"

Dim col As ADOX.ColumnClass = New ADOX.ColumnClass

col.ParentCatalog = cat

col.Type = ADOX.DataTypeEnum.adInteger

col.Name = "id"

col.Properties("Jet OLEDB:Allow Zero Length").Value = False

col.Properties("AutoIncrement").Value = True

tbl.Columns.Append(col, ADOX.DataTypeEnum.adInteger, 0)

Dim col2 As ADOX.ColumnClass = New ADOX.ColumnClass

col2.ParentCatalog = cat

col2.Name = "Description"

col2.Properties("Jet OLEDB:Allow Zero Length").Value = False

tbl.Columns.Append(col2, ADOX.DataTypeEnum.adVarChar, 25)

Dim col3 As ADOX.ColumnClass = New ADOX.ColumnClass

col3.ParentCatalog = cat

col3.Name = "数字"

col3.Type = DataTypeEnum.adDouble

col3.Properties("Jet OLEDB:Allow Zero Length").Value = False

tbl.Columns.Append(col3, ADOX.DataTypeEnum.adDouble, 666)

Dim col4 As ADOX.ColumnClass = New ADOX.ColumnClass

col4.ParentCatalog = cat

col4.Name = "Ole类型"

col4.Type = DataTypeEnum.adLongVarBinary

tbl.Columns.Append(col4, ADOX.DataTypeEnum.adLongVarBinary, 0)

tbl.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "id", "", "")

cat.Tables.Append(tbl)

msg.Text = ("<br>数据库表:" + tbl.Name + "已经创建成功!")

System.Runtime.InteropServices.Marshal.ReleaseComObject(tbl)

System.Runtime.InteropServices.Marshal.ReleaseComObject(cat)

tbl = Nothing

cat = Nothing

GC.WaitForPendingFinalizers()

GC.Collect()

End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

<title>在.NET框架下动态创建Access数据库和表</title>

</head>

<body>

<form id="form1" runat="server">

<asp:Label ID="msg" runat="server" />

</form>

</body>

</html>

【Update】下面的代码添加对现有数据库的字段添加:

//z 2012-08-10 19:33:37 IS2120@csdn.T2247216201[T74,L793,R28,V696]



<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

/// <summary>

/// CreateAccessDB 的摘要说明。

/// 对于不同版本的ADO,需要添加不同的引用

/// 请添加引用: Microsoft ADO Ext. 2.7 for DDL and Security

/// 请添加引用: Microsoft ADO Ext. 2.8 for DDL and Security

/// 另外,如果修改数据库,需要添加引用: Microsoft ActiveX Data Objects 2.8 Library

/// </summary>

protected void Page_Load( object sender, EventArgs e )

{

//为了方便测试,数据库名字采用比较随机的名字,以防止添加不成功时还需要重新启动IIS来删除数据库。

string dbName = Server.MapPath("~") + "NewMDB" + DateTime.Now.Millisecond.ToString() + ".mdb";

ADOX.CatalogClass cat = new ADOX.CatalogClass();

cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName + ";");

Response.Write("数据库:" + dbName + "已经创建成功!");

ADOX.TableClass tbl = new ADOX.TableClass();

tbl.ParentCatalog = cat;

tbl.Name = "MyTable";

//增加一个自动增长的字段

ADOX.ColumnClass col = new ADOX.ColumnClass();

col.ParentCatalog = cat;

col.Type = ADOX.DataTypeEnum.adInteger; // 必须先设置字段类型

col.Name = "id";

col.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

col.Properties["AutoIncrement"].Value = true;

tbl.Columns.Append(col, ADOX.DataTypeEnum.adInteger, 0);

//增加一个文本字段

ADOX.ColumnClass col2 = new ADOX.ColumnClass();

col2.ParentCatalog = cat;

col2.Name = "Description";

col2.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

tbl.Columns.Append(col2, ADOX.DataTypeEnum.adVarChar, 25);

//增加数字字段

ADOX.ColumnClass col3 = new ADOX.ColumnClass();

col3.ParentCatalog = cat;

col3.Name = "数字类型字段";

col3.Type = ADOX.DataTypeEnum.adDouble;

col3.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

tbl.Columns.Append(col3, ADOX.DataTypeEnum.adDouble, 666);

//增加Ole字段

ADOX.ColumnClass col4 = new ADOX.ColumnClass();

col4.ParentCatalog = cat;

col4.Name = "Ole类型字段";

col4.Type = ADOX.DataTypeEnum.adLongVarBinary;

col4.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

tbl.Columns.Append(col4, ADOX.DataTypeEnum.adLongVarBinary, 0);

Response.Write("<h4>得到各个列的名字:</h4>");

for (int i = 0 ; i < tbl.Columns.Count ; i++)

{

Response.Write("<li>" + i.ToString() + " = " + tbl.Columns[i].Name + " 类型:" + tbl.Columns[i].Type.ToString());

}

Response.Write("<h4>删除 Description 列:</h4>");

tbl.Columns.Delete("Description");

tbl.Columns.Refresh();

Response.Write("<h4>修改 “数字类型字段” 列名字:</h4>");

ADOX.ColumnClass col5 = (ADOX.ColumnClass)tbl.Columns["数字类型字段"];

col5.Name = "新名字类型字段";

tbl.Columns.Refresh();

//设置主键

tbl.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "id", "", "");

cat.Tables.Append(tbl);

Response.Write("<br>数据库表:" + tbl.Name + "已经创建成功!");

Response.Write("<h4>修改现有数据库:</h4>");

//打开已经存在的数据库,添加字段

string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName;

ADODB.Connection cn = new ADODB.Connection();

cn.Open(ConnectionString, null, null, 0);

cat = new ADOX.CatalogClass();

cat.ActiveConnection = cn;

Response.Write("数据库:" + dbName + "已经打开成功!");

ADOX.Table dbTable = cat.Tables["MyTable"];

//增加一个文本字段

ADOX.Column newColumn = new ADOX.Column();

newColumn.ParentCatalog = cat;

newColumn.Name = "Address";

newColumn.Properties["Jet OLEDB:Allow Zero Length"].Value = false;

dbTable.Columns.Append(newColumn, ADOX.DataTypeEnum.adVarChar, 255);

Response.Write("<br>数据库表:" + dbTable.Name + "修改成功!");

cn.Close();

System.Runtime.InteropServices.Marshal.ReleaseComObject(tbl);

System.Runtime.InteropServices.Marshal.ReleaseComObject(dbTable);

System.Runtime.InteropServices.Marshal.ReleaseComObject(cat);

System.Runtime.InteropServices.Marshal.ReleaseComObject(cn);

col = null;

col2 = null;

col3 = null;

col4 = null;

col5 = null;

newColumn = null;

tbl = null;

dbTable = null;

cat = null;

GC.WaitForPendingFinalizers();

GC.Collect();

}

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>创建、修改 Access 数据库</title>

</head>

<body>

<form id="Mengxianhui" runat="server"></form>

</body>

</html>

//z 2012-08-10 19:33:37 IS2120@csdn.T2247216201[T74,L793,R28,V696]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: