4

大量の行をデータベースに挿入し、その上に主キーを確立しようとしています。テーブルを作成してすぐにキーを設定すると、SQLBulkCopyコマンドを使用してもデータの挿入に10倍の時間がかかります。したがって、これは実行可能なオプションではありません。私が今やろうとしているのは、データを挿入し、すべて挿入した後、SMOを使用して主キーを作成することです。問題は、接続文字列でタイムアウトが0に設定されていても、alter()コマンドでタイムアウト例外が発生し続けることです。これを回避する方法について何かアイデアはありますか?

connectionString.ConnectTimeout = 0;

ServerConnection scon = null;
using (SqlConnection conn = new SqlConnection(connectionString.ConnectionString))
{
    conn.Open();
    try
    {
        scon = new ServerConnection(conn);
        Console.WriteLine("Server Connection Timeout: " + scon.ConnectTimeout);
        Server serv = new Server(scon);
        Database db = serv.Databases[connectionString.InitialCatalog];
        Table table = db.Tables[tableName];
        Index i = new Index(table, "pk_" + table.Name);
        i.IndexKeyType = IndexKeyType.DriPrimaryKey;
        foreach (String s in PrimaryKey)
        {
            i.IndexedColumns.Add(new IndexedColumn(i, s.Trim()));
        }
        table.Indexes.Add(i);
        table.Alter();
        scon.Disconnect();
    }
    finally
    {
        conn.Close();
    }
}
4

1 に答える 1

5

どうやらServerConnectionにもステートメントタイムアウトがあります。SMOはこれらの隠されたタイムアウトでいっぱいです。SQLBulkCopyを含みます。ただし、これを指摘してくれた@Derekに感謝します。答えは、StatementTimeout = 0に設定する必要があるということです。私は今これをテストしていますが、それが答えのようです。

CommandTimeoutを設定する方法

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.serverconnection.statementtimeout.aspx

于 2013-02-21T16:48:49.570 に答える