当前位置: 首页 > 编程语言 > C#

如何将sqlparameter传递给IN()?分享

时间:2023-04-10 11:48:48 C#

如何将sqlparameter传递给IN()?由于某种原因,我的IN()子句的Sqlparameter不起作用。如果我将参数替换为实际值StringBuildersb=newStringBuilder();代码编译正常并且查询有效foreach(用户列表中的用户用户){sb.Append(user.UserId+",");}stringuserIds=sb.ToString();userIds=userIds.TrimEnd(newchar[]{','});SELECTuserId,usernameFROMUsersWHEREuserIdIN(@UserIds)您必须为IN子句中的每个值创建一个参数。SQL需要如下所示:SELECTuserId,usernameFROMUsersWHEREuserIdIN(@UserId1,@UserId2,@UserId3,...)因此您需要在foreach循环中创建参数和IN子句。像这样的东西(在我的脑海中,未经测试):StringBuildersb=newStringBuilder();诠释我=1;foreach(UseruserinUserList){//IN子句sb.Append("@UserId"+i.ToString()+",");//参数YourCommand.Parameters.AddWithValue("@UserId"+i.ToString(),user.UserId);我++;如果您使用的是SQL2008,您可以创建一个存储过程,它接受表值参数(TVP)并使用ADO.net执行存储过程并将数据表传递给它:首先,您需要在您的SQLserver:CREATETYPE[dbo].[udt_UserId]ASTABLE([UserId][int]NULL)然后你需要编写一个存储过程接受这个类型作为参数:CREATEPROCEDURE[dbo].[usp_DoSomethingWithTableTypedParameter](@UserIdListudt_UserIdREADONLY)ASBEGINSELECTuserId,usernameFROMUsersWHEREuserIdIN(SELECTUserIdFROM@UserIDList)END现在来自.net,您不能使用LINQ,因为它不支持表值参数;所以你必须编写一个函数来执行普通的旧ADO.net,获取一个DataTable,并将其传递给存储过程:我编写了一个我使用的通用函数,只要它只需要一个参数,它就会对任何存储过程执行此操作表格类型,无论它是什么;publicstaticintExecStoredProcWithTVP(DbConnectionconnection,stringstoredProcedureName,stringtableName,stringtableTypeName,DataTabledt){使用(SqlConnectionconn=newSqlConnection(connection.ConnectionString)){SqlCommandcmd=newSqlCommand(storedProcedureName,conn);cmd.CommandType=CommandType.StoredProcedure;SqlParameterp=cmd.Parameters.AddWithValue(tableName,dt);p.SqlDbType=SqlDbType。结构化的;p.TypeName=tableTypeName;conn.Open();introwsAffected=cmd.ExecuteNonQuery();//或者可以执行reader并传递一个Func来对datareader执行操作;conn.Close();然后你可以写出使用这个实用函数的DAL函数和存储过程的实际名称;基于您的问题示例,代码如下所示:publicintusp_DoSomethingWithTableTypedParameter(ListuserIdList){DataTabledt=newDataTable();dt.Columns.Add("UserId",typeof(int));foreach(varuserIdinupdateList){dt.Rows.Add(newobject[]{userId});}introwsAffected=ExecStoredProcWithTVP(Connection,"usp_DoSomethingWithTableTypedParameter","@UserIdList","udt_UserId",dt);返回受影响的行;注意上面的“连接”参数——我实际上在DataContext类的一部分中使用了这种类型的函数,它扩展了TVPfuncLINQDataContext的更新,并且仍然使用方法(使用varcontext=newMyDataContext())语法这仅在您使用SQLServer2008时有效-希望您是,如果不是,这可能是升级的好理由!当然,在大多数情况下,在大型生产环境中,这并不容易,但如果你有可用的技术,我认为这是实现这一目标的最佳方式。可能的“干净”版本:StringBuilderB=newStringBuilder();for(inti=0;ix.Name)));SQLServer将您的IN子句视为:IN('a,b,c')它需要看起来像:IN('a','b','c')有更好的方法来做您想要的。以上就是C#学习教程:如何将sqlparameter传给IN()?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: