Tag: ado.net

await / async Microsoft Practices企业库数据

我有一个较旧的应用程序,我在其中使用Microsoft.Practices.EnterpriseLibrary.Data从数据库中获取数据。 我最近升级到.NET 4.5并希望利用await / async 。 根据命名标准,我没有看到任何以“Async”结尾的方法,即使在最新版本的软件包中也是如此。 是否可以在不手动使其异步的情况下对此ADO .NET库使用await / async?

在B#和MS SQL Server中将布尔类型传递给位参数类型

我有一个C#方法接受clientId(int)和hasPaid(boolean),表示客户端是否已付款。 MS SQL Server存储过程需要@HasPaid参数的BIT值(1或0),但该方法需要hasPaid的boolean类型(true / false)。 ADO.NET代码是否会将boolean转换为SQL Server的bit类型,还是需要将hasPaid的值转换为1 or 0 ? public void UpdateClient(int clientId, bool hasPaid) { using (SqlConnection conn = new SqlConnection(this.myConnectionString)) { using (SqlCommand sqlCommand = new SqlCommand(“uspUpdatePaymentStatus”, conn)) { sqlCommand.CommandType = CommandType.StoredProcedure; sqlCommand.Parameters.AddWithValue(“@ClientID”, clientId); sqlCommand.Parameters.AddWithValue(“@HasPaid”, hasPaid); sqlCommand.Connection.Open(); var rowsAffected = sqlCommand.ExecuteNonQuery(); } } }

如何让LIKE子句在ADO.NET和SQL Server中工作

我在ASP.NET中进行了一个非常简单的查询,但在插入LIKE子句后它停止工作。 例: String sql = ” SELECT * FROM Products WHERE ID = @MYID AND Name LIKE ‘%@MYNAME%’ “; SqlCommand command = new SqlCommand(sql, cn); command.Parameters.AddWithValue(“@MYID”, MYID.Text); command.Parameters.AddWithValue(“@MYNAME”, MYNAME.Text); 如果我删除LIKE它的工作原理。 因此,我在考虑它与”引用?

如何在必要时使用ADO.NET Entity Framework加载varbinary(max)字段?

我的一个表中有一个varbinary(max)字段,但我不是每次都需要它,而且我正在寻找一种只在必要时从数据库中获取它的方法。 我正在使用ADO.NETentity framework。 怎么做?

从SQL Server读取十进制值时出现溢出exception

我想知道这是一个错误还是我出错了。 我正在使用SQL Server 2008数据库中的SqlDataReader加载值,但在某些情况下,它无法将SQL值转换为.net值。 (.NET 4.0) 我已将其追溯到一个测试案例,该案例演示了实际问题: 工作范例: “select convert(decimal(38, 19), 260000 ) as test” rs.GetValue(1); –> returns 260000 (decimal) 不工作: “select convert(decimal(36, 26), 260000 ) as test” rs.GetValue(1); –> throws System.OverflowException: Conversion overflows. at System.Data.SqlClient.SqlBuffer.get_Decimal() at System.Data.SqlClient.SqlBuffer.get_Value() at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) 我已经检查了SQL Server恢复的实际值。 他们的不同之处在于,非工作人员使用4个整数来表示价值,而工作人员只使用3个。 我还检查了.net Reflector的源代码,它揭示了如果值存在超过3个值时抛出exception,但我不理解它们背后的机制。 所以,我想知道这是否是.net框架中的真正错误。

使用12c客户端截断的存储过程OUTPUT VARCHAR2值

我正在使用oracle 11g 。 我的存储过程返回varchar2但它的值被oracle client截断。 以下是我的代码: if ((ds != null) && (ds.Tables.Count > 0)) { foreach (DataRow rw in ds.Tables[0].Rows) { OracleParameter param = new OracleParameter((rw[“argument_name”]).ToString(), GetOracleType(rw[“data_type”].ToString().ToUpper())); param.Direction = GetParameterDirection((rw[“in_out”]).ToString().ToUpper()); discoveryCommand.Parameters.Add(param); if (param.Direction == ParameterDirection.Output && param.OracleType == OracleType.VarChar) { param.Size = 4000; } } } 我将param.size增加到4000但仍然会截断值。 对此有什么解决方案吗? 在服务器上我有Oracle 12c 。 我需要在我的项目中不更新oracle客户端版本的情况下获得解决方案,因为某些原因不允许这样做。 以下是SP。 我修改它以返回硬编码值。 还是同样的问题。 […]

如何管理解析DateTime的空对象以与ADO.NET一起用作DBNULL

我有两个DateTime对象,BirthDate和HireDate。 它们被正确格式化为字符串,当我将它们传递给我的数据访问层时,需要将它们解析为DateTime对象。 DateTime hD = DateTime.Parse(hire); DateTime bD = DateTime.Parse(birth); //incase of a datestring being passed through dateStringPassed = “7/2/1969″; 但有时候,字符串hire和birth是空的或空的”” ,如果代码是这样运行的,我从解析空字符串得到一个FormatException错误。 如何管理空分析并允许DateTime(如果为空或null)被接受为DBNull.Value ? 我仍然无法管理用户没有通过DateTime字符串,然后解析崩溃了我的代码。 我的出生日期参数如下,如果为null则检查变量,然后使用DBNull.Value。

C#Mysql – 在async await服务器上使用数据库查询的锁

我有TcpListener类,我正在使用async/await读写。 对于这个服务器,我创建了单个数据库实例,我准备了所有数据库查询。 但对于一个以上的TcpClient我一直在exception: MySql.Data.MySqlClient.MySqlException发生MySql.Data.dll类型的exception,但未在用户代码中处理 附加信息:已经有一个与此Connection关联的打开DataReader ,必须先关闭它。 如果我理解正确,那么一次数据库查询就不会超过一个async客户端的问题。 所以我只是在我的查询中添加了锁,这样一切似乎都很好。 // One MySqlConnection instance for whole program. lock (thisLock) { var cmd = connection.CreateCommand(); cmd.CommandText = “SELECT Count(*) FROM logins WHERE username = @user AND password = @pass”; cmd.Parameters.AddWithValue(“@user”, username); cmd.Parameters.AddWithValue(“@pass”, password); var count = int.Parse(cmd.ExecuteScalar().ToString()); return count > 0; } 我也尝试使用这个方法为每个查询创建新连接,如SO社区的某个人所提到的,但这个方法比锁慢得多: using (MySqlConnection connection = new […]

在oracle中防止SQL注入

首先我尝试使用以下代码 strQuery = @”SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper(‘” + UserPrefix + “‘)”; try { ocommand = new OracleCommand(); if (db.GetConnection().State == ConnectionState.Open) { ocommand.CommandText = strQuery; ocommand.Connection = db.GetConnection(); odatareader = ocommand.ExecuteReader(); odatareader.Read(); 最后我转换了上面的查询,以防止像这样的SQL注入 strQuery = @”SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper(:UserPrefix)”; try { ocommand = new OracleCommand(); if (db.GetConnection().State == ConnectionState.Open) […]

ADO.NET DataTable / DataRow线程安全

介绍 一位用户今天早上向我报告说,他遇到了一些问题,即我们作为内部框架的一部分提供的某些并行执行代码的结果不一致(即,列值有时会在它们不应该出现时为null)。 这段代码过去运行良好,最近没有被篡改过,但它让我想到了以下片段: 代码示例 lock (ResultTable) { newRow = ResultTable.NewRow(); } newRow[“Key”] = currentKey; foreach (KeyValuePair output in outputs) { object resultValue = output.Value; newRow[output.Name] = resultValue != null ? resultValue : DBNull.Value; } lock (ResultTable) { ResultTable.Rows.Add(newRow); } (不保证编译,手工编辑以掩盖专有信息。) 说明 我们在系统中的其他位置都有这种级联类型的锁定代码,它工作正常,但这是我遇到的与ADO .NET交互的级联锁定代码的第一个实例。 众所周知,框架对象的成员通常不是线程安全的(在这种情况下就是这种情况),但是级联锁定应该确保我们不会同时读取和写入ResultTable.Rows。 我们很安全,对吗? 假设 好吧,级联锁定代码不能确保我们在向新行中的列分配值的同时不读取或写入ResultTable.Rows。 如果ADO .NET使用某种缓冲区来分配非线程安全的列值,即使涉及不同的对象类型(DataTable与DataRow),该怎么办? 有没有人遇到过这样的事情? 我以为我会在StackOverflow问这里,然后在几个小时内打败我的脑袋:) 结论 嗯,共识似乎是将级联锁更改为完全锁已解决了这个问题。 这不是我预期的结果,但完全锁定版本在许多很多测试之后都没有产生问题。 教训:警惕在您无法控制的API上使用的级联锁。 […]