批量插入未保存到数据库

时间:2014-08-11 14:45:03

标签: c# sql .net sql-server bulkinsert

我有以下方法。执行完成后,我的数据库表中没有数据。 没有异常被抛出/吞噬。奇怪的是,如果我将查询字符串剪切并粘贴到SSMS中并执行它,脚本就会执行并且表中有数据。有什么理由说这不能用于.NET吗?

static void ImportTableData(String tableName)
{
    using (SqlConnection connection = new SqlConnection(
        @"Server=MYDOMAIN\MYSERVER;Database=MY_DATABASE;Trusted_Connection=True;"))
    {
        String schemaOwner = tableName.Substring(0, 3);

        const String sqlScript =
            @"BULK
            INSERT {0}
            FROM 'C:\Users\me\Desktop\{1}\{0}.csv'
            WITH
            (
                FIELDTERMINATOR = '\t',
                ROWTERMINATOR = '\r\n',
                FORMATFILE = 'C:\Users\me\Desktop\{1}\{0}.xml',
                DATAFILETYPE='native'
            )";

        String realQuery = String.Format(sqlScript, tableName, schemaOwner);
        connection.Open();

        using (SqlTransaction tran = connection.BeginTransaction())
        {
            using (SqlCommand command = new SqlCommand(realQuery, connection, tran))
            {
                command.ExecuteNonQuery();
            }

            tran.Commit();
        }
    }
}

realQuery的内容是:

BULK
INSERT SCHEMA_OWNER.TABLE
FROM 'C:\Users\me\Desktop\SCHEMA\SCHEMA_OWNER.TABLE.csv'
WITH
(
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '\r\n',
    FORMATFILE = 'C:\Users\me\Desktop\SCHEMA\SCHEMA_OWNER.TABLE.xml',
    DATAFILETYPE='native'
)

修改

我尝试将realQuery变量写入sql文件。如果我从SSMS执行此操作,则会插入数据。如果我从.NET执行sql文件,则不会插入数据。它是通过两种方式执行的完全相同的脚本。

String realQuery = String.Format(sqlScript, tableName, schemaOwner);
File.WriteAllLines(@"C:\Users\me\Desktop\temp.sql", new[] { realQuery });
String script = File.OpenText(@"C:\Users\me\Desktop\temp.sql").ReadToEnd();

using (SqlCommand command = new SqlCommand(script, connection, tran))
{
    command.ExecuteNonQuery();
    tran.Commit();
}

1 个答案:

答案 0 :(得分:1)

首先运行探查器并查看应用程序发送到数据库的确切内容。你可能会看到问题。

此外,在从应用程序发送的上下文中,数据库是否可以访问您的个人c:驱动器,还是会查看数据库服务器的c:驱动器?一般来说,我从不使用个人位置,而是使用我正在使用的服务器。