Tag: ado.net

使用ODP.NET按名称绑定查询参数

我目前正在使用Oracle的Microsoft ADO.NET提供程序( System.Data.OracleClient )。 我知道它肯定不是最好的Oracle提供商,它很快就会被弃用 ,我应该使用Oracle的ODP.NET。 我仍然使用MS提供程序的原因是因为ODP.NET按位置绑定参数 ,而不是按名称绑定 。 当您在查询中使用许多参数时,这实际上可以是PITA,因为您必须小心地以正确的顺序添加它们,这很容易导致错误。 在同一查询中多次使用相同参数时也很烦人,例如: SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0 使用ODP.NET,我必须向OracleCommand添加两个参数,我认为这是愚蠢的…… ODP.NET的OracleCommand具有更改默认行为的属性: BindByName 。 设置为true时,参数按名称绑定,这就是我想要的。 不幸的是,这对我没有帮助,因为: 默认设置为false 我几乎从不明确地使用具体的ADO.NET类,我更喜欢使用ADO.NET 2.0抽象层( DbProviderFactory , DbConnection , DbCommand …)来减少与任何特定RDBMS的耦合。 所以我没有访问BindByName属性,除非我明确地转换为OracleCommand ,失去了所有的好处或抽象。 当使用ASP.NET SqlDataSource时,我自己不创建DbCommand,所以我没有机会将BindByName设置为true(我可以在Selecting事件中执行它,但实际上这样做真的很痛苦)每个SqlDataSource ……) 我该如何处理这个问题? 某处有BindByNameByDefault设置吗? (我没有找到类似的东西,但我可能错过了……)

如何使用executeReader()方法检索一个单元格的值

我需要执行以下命令并将结果传递给标签。 我不知道怎么能用Reader做到这一点。 有人可以帮个忙吗? String sql = “SELECT * FROM learer WHERE learer.id = ” + index; SqlCommand cmd = new SqlCommand(sql,conn); learerLabel.Text = (String) cmd.ExecuteReader(); 正如您所看到的,我创建了SQL语句并执行它,但它不起作用。 为什么? 控制台说: 不能隐式SqlDataReader到String … 如何以Stringforms获得所需的结果,以便标签可以正确显示。

SQL Server连接数的任何限制?

我使用的是SQL Server 2008 Enterprise + C#+ ADO.Net + .Net 3.5。 我正在使用sp_who2或sys.dm_exec_connections来查找活动连接数(如果我找到有效连接数的方法错误,请告诉我)。 对于一些繁重的数据库消费者应用程序,我甚至可以找到活动连接数> 1000。 我想知道SQL Server的活动连接数是否有任何上限限制? 乔治,提前谢谢

从DataRow(C#)检索DateTime值

如何从行中获取C#中的DateTime值,当前代码给出了错误,任何帮助都表示赞赏,数据来自进度数据库: foreach (DataRow r in ds.Tables[0].Rows) { string prodCode = r[“PRD-CDE”].ToString(); statCode = r[“STAT”].ToString(); DateTime firstIssueDate = (DateTime)(r[“FISS”]); DateTime endIssueDate = (DateTime)(r[“EISS”]); if(endIssueDate > DateTime.Now) { /*do some thing…*/} else {/*user invalid…*/} } 获取日期转换和解析有两种方法,谢谢大家的帮助 最终工作代码片段: foreach (DataRow r in ds.Tables[0].Rows) { string prodCode = r[“PRD-CDE”].ToString(),statCode = r[“STAT”].ToString(); // r.(“FISS”); if (r[“FISS”] != DBNull.Value) { DateTime […]

SQL Server连接的初始连接速度很慢。 为什么?

我遇到了在两个站点安装了C#应用程序的情况,其中与SQL Server的初始连接非常慢。 我编写了一个测试应用程序来validation减速发生的位置,它位于第一个SQLConnection.Open语句中。 通过命名管道建立与服务器的连接大约需要41秒。 我们认为这可能是一个DNS问题,但使用TCP / IP连接速度一样慢。 建立初始连接后,将连接池并且应用程序正常响应。 工作站和服务器都是运行Windows 7 Pro,Core 2 Duo 3.16 Ghz和4 gig Ram的不错的机器。 我在微软论坛上找到了以下文章: http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/f295994c-5812-4e46-8ac9-f05471d4dd54 关闭LLMNR协议确实将初始连接时间缩短了大约一半到21秒。 但是,这仍然需要很长时间才能获得与SQL Server的初始连接。 唯一与我们的标准略有不同的是,在这种情况下,DNS是通过路由器完成的,而不是实际的服务器。 到目前为止,这只发生在两个地方,其他地方没有任何问题。 任何帮助,将不胜感激。 谢谢你,丹尼斯

从ADO.NET中的存储过程获取返回值

我知道还有另一个问题,几乎相同的标题,但它没有回答我的问题。 我有一个存储过程,它在插入后返回唯一标识符(@@ identity)。 我在服务器资源管理器中尝试了它,它按预期工作(@RETURN_VALUE = [identifier])。 在我的代码中,我添加了一个名为“@RETURN_VALUE”的参数,其中ReturnValue方向优先于任何其他参数,但是当我使用ExecuteNonQuery()运行我的查询时该参数保持为空。 我不知道我做错了什么。 我的SPROC: ALTER PROCEDURE dbo.SetAuction ( @auctionID int, @itemID int, @auctionType tinyint, @reservationPrice int, @maxPrice int, @auctionEnd datetime, @auctionStart datetime, @auctionTTL tinyint, @itemName nchar(50), @itemDescription nvarchar(MAX), @categoryID tinyint, @categoryName nchar(50) ) AS IF @auctionID 0 BEGIN BEGIN TRAN T1 UPDATE Auction SET AuctionType = @auctionType, ReservationPrice = @reservationPrice, […]

SQL Server的超时设置

我正在使用VSTS 2008 + ADO.Net + C#+。Net 3.5 + SQL Server 2008.我在客户端使用ADO.Net连接到数据库服务器以执行存储过程,然后从存储过程返回结果。 这是我的代码。 我有两个关于超时的问题, 如果我没有明确设置任何超时相关设置,对于与数据库服务器的连接,是否有任何超时设置(例如,如果在一段默认时间内无法连接到数据库服务器,会有一些超时exception?)? 如果我没有明确设置任何超时相关设置,对于执行存储过程,是否有任何超时设置(例如,如果无法从服务器检索到ADO.Net客户端的结果一段默认时间,则会有一些超时例外?)? using (SqlConnection currentConnection = new SqlConnection(“Data Source=.;Initial Catalog=TestDB;Trusted_Connection=true;Asynchronous Processing=true”)) { // check current batch conut currentConnection.Open(); using (SqlCommand RetrieveOrderCommand = new SqlCommand()) { RetrieveOrderCommand.Connection = currentConnection; RetrieveOrderCommand.CommandType = CommandType.StoredProcedure; RetrieveOrderCommand.CommandText = “prc_GetOrders”; RetrieveBatchCountCommand.Parameters.Add(“@Count”, SqlDbType.Int).Direction = ParameterDirection.Output; RetrieveBatchCountCommand.ExecuteNonQuery(); int rowCount = […]

如何在C#中使用ADO获得高效的Sql Server死锁处理?

我有一个类’数据库’,作为ADO.net的包装器。 例如,当我需要执行一个过程时,我调用Database.ExecuteProcedure(procedureName,parametersAndItsValues)。 我们遇到了SQL Server 2000中死锁情况的严重问题。我们团队的一部分正在处理sql代码和事务以最小化这些事件,但我正在考虑使这个数据库类能够抵御死锁情况。 我们希望死锁受害者可能在经过一段时间的延迟后重试,但我不知道是否可能。 以下是我们使用的方法的代码: public int ExecuteQuery(string query) { int rows = 0; try { Command.Connection = Connection; Command.CommandType = CommandType.Text; if(DatabaseType != enumDatabaseType.ORACLE) Command.CommandText = query; else Command.CommandText =”BEGIN ” + query + ” END;”; if (DatabaseType != enumDatabaseType.SQLCOMPACT) Command.CommandTimeout = Connection.ConnectionTimeout; if (Connection.State == ConnectionState.Closed) Connection.Open(); rows = Command.ExecuteNonQuery(); } […]

“读取器关闭时调用Read的无效尝试”错误(仅适用于冗长的操作)

我们有一个操作,从csv文件中读取超过100.000条记录并插入数据库。 当我使用包含10条记录的文件时,操作在不到一分钟的时间内成功完成。 当我使用100.000记录时,我在10分钟后收到以下错误“无效尝试在读取器关闭时调用读取”。 是否有可以配置的超时以避免此错误? 注意:CommandTimeout已设置为零。 DbCommand cmd = db.GetStoredProcCommand(“aspInsertZipCode”); cmd.CommandTimeout = 0; dataStringToProcess.Remove(dataStringToProcess.Length – 1, 1); db.AddInParameter(cmd, “@DataRows”, DbType.String, dataStringToProcess.ToString()); db.AddInParameter(cmd, “currDate”, DbType.DateTime, DateTime.Now); db.AddInParameter(cmd, “userID”, DbType.Int32, UserID); db.AddOutParameter(cmd, “CountOfUnchangedZipCode”, DbType.String, 1000); DbDataReader rdr = null; try { rdr = (DbDataReader)db.ExecuteReader(cmd); if (rdr.Read()) { if (!String.IsNullOrEmpty(Utility.GetString(rdr, “NewZipCode”))) strNewZipCode = strNewZipCode + “,” + Utility.GetString(rdr, “NewZipCode”); […]

如何将SQL查询重新编写为参数化查询?

我听说我可以通过使用参数化查询来防止SQL注入攻击,但我不知道如何编写它们。 我如何将以下内容编写为参数化查询? SqlConnection con = new SqlConnection( “Data Source=” + globalvariables.hosttxt + “,” + globalvariables.porttxt + “\\SQLEXPRESS;” + “Database=ha;” + “Persist Security Info=false;” + “UID='” + globalvariables.user + “‘;” + “PWD='” + globalvariables.psw + “‘”); string query = “SELECT distinct ha FROM app WHERE 1+1=2”; if (comboBox1.Text != “”) { query += ” AND firma […]