2013-02-21 62 views
4

我将大量行插入数据库并尝试在其上建立主键。如果我立即创建表并建立密钥,那么即使使用SQLBulkCopy命令插入数据也需要10倍的时间。所以这不是一个可行的选择。我现在要做的就是插入数据,并在插入数据后,使用SMO创建主键。问题是,即使连接字符串中的超时设置为0,我仍然在alter()命令上获取超时异常。任何想法如何解决这个问题?SMO中的连接超时

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(); 
    } 
} 
+0

是使用SMO的要求? – 2013-02-21 15:32:14

+0

@MichaelPerrenoud为了清晰和一致的代码,我想。你想创建一个SQL脚本并运行它吗? – dko 2013-02-21 15:39:09

+0

你不需要conn.close(),你已经将连接封装在Using语句中,连接将自动关闭。 – Derek 2013-02-21 15:42:02

回答

5

显然ServerConnection也有一个语句超时。 SMO充满了这些隐藏的超时。包括SQLBulkCopy。不过,感谢@Derek指出了这一点。答案是你必须设置StatementTimeout = 0。我现在正在测试它,但它似乎是答案。

How to set CommandTimeout

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

+0

不幸的是,2.5小时后,我得到了一个不同的例外。仍然有些事情与超时有关。但是,经过2个多小时试图获得主密钥,我认为这是合理的。 – dko 2013-02-22 16:42:34