0

作为数据转换过程的一部分,我最近编写了一个脚本来向数据库表中添加一列。我正在使用 ODBC,性能不是一个大问题。

JScript - 这很好用

var cxn = new ActiveXObject("Adodb.connection");
cxn.Open(connectionString);
var statement = "alter table MyTable add MyColumn varchar(40) null";
var changed = 0;
cxn.execute(statement, changed, 0x80);

MFC/C++ & CDatabase/ODBC - 工作也很好

CDatabase db;
if (db.Open(NULL, FALSE, FALSE, szConnectionString, FALSE)) 
   db.ExecuteSQL("ALTER TABLE MyTable ADD MyColumn VARCHAR(40) NULL");

C#/ADONet - 不起作用

using (var cxn = GetOpenConnection())
{
    var cmd = cxn.CreateCommand();
    cmd.CommandText = "ALTER TABLE MyTable ADD MyColumn VARCHAR(40) NULL";

    // MS Access specific SQL also fails
    //cmd.CommandText = "ALTER TABLE MyTable ADD COLUMN MyColumn TEXT(40)";

    cmd.ExecuteNonQuery();
    ....

ExecuteNonQuery() 返回 -1 表示失败。我不确定为什么。

同样,这三个都使用具有相同连接字符串的 ODBC。为什么 C# 版本不起作用?

4

2 回答 2

0

我希望这围绕框架和非框架对象展开。

在 JScript 中,您使用 Adodb 连接连接到访问后端,该连接是一个 COM+(即不是 .Net)对象。

我不确定 ODBC 连接到底是什么,但希望它是相似的。

使用 ADO.Net,您正在使用托管 (.Net) 连接进行连接,但它会失败。

我不具体知道访问后端不是 .Net 对象(如果它是 .mdb 肯定不是,但我不太确定 .accdb),但这肯定是您报告的结果的含义。

于 2013-09-18T23:55:23.957 回答
0

我建议你试试这个命令文本:

cmd.CommandText = "ALTER TABLE [MyTable] ADD COLUMN [MyColumn] TEXT(40)";
于 2014-05-25T07:50:52.633 回答