我正在读取csv文件并将信息插入到sql 2005数据库中。
在大约250次object.save操作之后,它超时了。这里是代码和确切的错误消息。这不是代码的第一个版本,但它总是给出相同的时间。
这不是一个大数据库,只有2个表。有什么我不做的事吗?是否为每个保存操作打开和关闭连接。关于这个问题的所有意见都是受欢迎的。
List<shipment> oLstShipments = new List<shipment>();
while (oReader.ReadNextRecord())
{
int iIdShipment;
if (int.TryParse(oReader[0], out iIdShipment))
{
shipment oShipment = new shipment();
oShipment.idShipment = iIdShipment;
oShipment.dateDelivered = oReader[1];
oShipment.inventoryGroup = oReader[2];
oShipment.companyId = oReader[3];
oShipment.shipTo = oReader[4];
oShipment.carrier = oReader[5];
oShipment.accountOwner = oReader[6];
oShipment.accountNumber = oReader[7];
oShipment.trackingNumber = oReader[8];
oLstShipments.Add(oShipment);
}
}
oReader.Dispose();
oSR.Dispose();
foreach (shipment oShip in oLstShipments)
{
oShip.Save();
}
错误:
System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SubSonic.DataProviders.DbDataProvider.CreateConnection(String connectionString)
at SubSonic.DataProviders.DbDataProvider.CreateConnection()
at SubSonic.DataProviders.AutomaticConnectionScope..ctor(IDataProvider provider)
at SubSonic.DataProviders.DbDataProvider.ExecuteReader(QueryCommand qry)
at SubSonic.Repository.SubSonicRepository`1.Add(T item, IDataProvider provider)
at invoiceRetriever.Data.shipment.Add(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 516
at invoiceRetriever.Data.shipment.Save(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 531
at invoiceRetriever.Data.shipment.Save() in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 525
at invoiceRetriever.frmHaasFiles.cmdProcess_Click(Object sender, EventArgs e) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\frmFiles.cs:line 59
测试#1
for (int i = 1; i < 200; i++)
{
try
{
shipment oShipment = new shipment();
oShipment.idShipment = i;
oShipment.dateDelivered = "10/10/2009";
oShipment.inventoryGroup = "123";
oShipment.companyId = "1";
oShipment.shipTo = "shipToTest";
oShipment.carrier = "carrierTest";
oShipment.accountOwner = "me";
oShipment.accountNumber = "123456";
oShipment.trackingNumber = "track001";
oShipment.Save();
}
catch (Exception ex)
{
MessageBox.Show("failed at #: " + i + Environment.NewLine + ex.ToString());
break;
}
}
提出异常:
failed at #: 267
System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SubSonic.DataProviders.DbDataProvider.CreateConnection(String connectionString)
at SubSonic.DataProviders.DbDataProvider.CreateConnection()
at SubSonic.DataProviders.AutomaticConnectionScope..ctor(IDataProvider provider)
at SubSonic.DataProviders.DbDataProvider.ExecuteReader(QueryCommand qry)
at SubSonic.Repository.SubSonicRepository`1.Add(T item, IDataProvider provider)
at invoiceRetriever.Data.shipment.Add(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 516
at invoiceRetriever.Data.shipment.Save(IDataProvider provider) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 531
at invoiceRetriever.Data.shipment.Save() in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\ActiveRecord.cs:line 525
at invoiceRetriever.frmHaasFiles.cmdProcess_Click(Object sender, EventArgs e) in D:\programmation\ceb\invoiceRetriever\invoiceRetriever\frmHaasFiles.cs:line 50
如果我尝试分离数据库,它会说101个活动连接(1个用于管理工作室,其余用于代码。)
如果我像以前一样尝试使用repo列表,我会得到以下异常:System.Data.SqlClient.SqlException:传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。此RPC请求中提供的参数太多。最高为2100。
我很确定我做错了什么,我不能成为唯一想在数据库中插入这么多项目的人。
EDIT 12/13/2009 09:44:00:
以下是创建货件表的脚本。
/****** Object: Table [dbo].[shipment] Script Date: 12/11/2009 14:33:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[shipment](
[idShipment] [int] NOT NULL,
[dateDelivered] [varchar](255) NULL,
[inventoryGroup] [varchar](255) NULL,
[companyId] [varchar](255) NULL,
[shipTo] [varchar](255) NULL,
[carrier] [varchar](255) NULL,
[accountOwner] [varchar](255) NULL,
[accountNumber] [varchar](255) NULL,
[trackingNumber] [varchar](255) NULL,
[cebnowaybill] [varchar](50) NULL,
CONSTRAINT [PK_shipment] PRIMARY KEY CLUSTERED
(
[idShipment] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
答案 0 :(得分:1)
发布的版本3。0。0。3(7月)中存在一个错误,但在早期版本中没有。 它是一个rdr没有包含使用或后跟rdr.close。它会产生我提到的效果。连接被打开但未关闭...意味着连接池变满。
自从Rob在很多电子邮件中反对讨论后,它已得到纠正。你必须进入github上的source选项卡才能找到更正。感谢所有帮助过的人。特别感谢Adam(因为没有放弃这么多回复)以及Rob快速回复我的电子邮件。
亚音速很棒,花时间找到问题的答案。
答案 1 :(得分:0)
超时是由于数据库没有可用的连接而导致的,我的猜测是来自某个读者在某处保持打开状态。
首先 - 为什么ReadNextRecord()?你的意思是使用Read()吗?您也可以将阅读器传递给Load(),它会为您加载对象。
最后 - 我建议将它包装在一个using语句中,以确保即使出现错误,读者和所有内容都会被关闭。
编辑: 在阅读下面的回复时 - 您是否为您的桌子定义了主键?
答案 2 :(得分:0)
Sylvain而不是告诉你如何解决你的问题我会告诉你应该做什么。因此,不要担心如何保存每个单独的项目而不必连接打开超过100次,您应该执行一次批处理操作,一次保存所有记录。
以下是SimpleRepo的示例,但这也可以使用Active Record来完成
var repo=new SimpleRepository();
repo.AddMany(oLstShipments);