问题描述
publicDataSetget_doc(stringcuid,intdoctype){SqlParameter[]pars={MakeInParam("@cuid",SqlDbType.NVarChar,200,cuid),MakeInParam("@doctype",SqlDbType.TinyInt,4,doctype),};returnRunProc("selecta.*,b.flow_name,c.node_name,c.node_type_id,c.node_order_id,c.node_next_idfromt_doca,t_flowb,t_nodecwherea.df=0anda.cuin(@cuid)anda.stin(0,1,4)anda.doc_type=@doctypeanda.flow_id*=b.flow_idanda.node_id*=c.node_idorderbya.doc_iddesc",pars,"t_doc123");}
publicDataSetRunProc(stringprocN,SqlParameter[]prams,stringtbN){SqlDataAdapterdap=CreateDataAdaper(procN,prams);DataSetds=newDataSet();dap.Fill(ds,tbN);this.Close();returnds;}
privateSqlDataAdapterCreateDataAdaper(stringprocN,SqlParameter[]prams){this.Open();SqlDataAdapterdap=newSqlDataAdapter(procN,con);dap.SelectCommand.CommandType=CommandType.Text;if(prams!=null){foreach(SqlParameterparameterinprams)dap.SelectCommand.Parameters.Add(parameter);}dap.SelectCommand.Parameters.Add(newSqlParameter("ReturnValue",SqlDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty,DataRowVersion.Default,null));returndap;}
问题出在这个语句:selecta.*,b.flow_name,c.node_name,c.node_type_id,c.node_order_id,c.node_next_idfromt_doca,t_flowb,t_nodecwherea.df=0anda.cuin(@cuid)anda.stin(0,1,4)anda.doc_type=@doctypeanda.flow_id*=b.flow_idanda.node_id*=c.node_idorderbya.doc_iddesc的in(@cuid)程序会跳到:protectedoverridevoidDispose(booldisposing){if(disposing&&(components!=null)){components.Dispose();}base.Dispose(disposing);}
如果不传参数,直接in(1,2,3,4)这样。程序就没问题了。请问有为什么和怎么解决呢?
解决方案
解决方案二:
不要把"1,2,3,4"作为一个参数,这明明应该是4个参数
解决方案三:
你需要理解什么是参数化查询,为什么要传参数不要把它想象成传递了参数之后还是直接在数据库里拼接字符串那么简单如果真是那样,参数化查询就没有任何存在的意义了,自己程序里直接拼接不一样吗
解决方案四:
每个参数只能是一个字段值,而逗号是语法,你把逗号放进参数里,整个语法都出错了,当然是无法执行成功的参数里真的能放语法的话,那么参数化查询也根本解决不了SQL注入的问题了正是因为参数就是参数,里面没有语法,才能解决SQL注入的问题
解决方案五:
引用2楼Z65443344的回复:
你需要理解什么是参数化查询,为什么要传参数不要把它想象成传递了参数之后还是直接在数据库里拼接字符串那么简单如果真是那样,参数化查询就没有任何存在的意义了,自己程序里直接拼接不一样吗
程序里写可以,只是方法都写好了。stringcuid="1,2,3,4";再把cuid作为参数发过去不行吗?in()里面放的是什么类型呢?
解决方案六:
in(,,,)这是个语法,每个用逗号隔开的,都是字段值,而逗号本身是语法的一部分好比select*from表你不能把select作为参数传入
解决方案七:
in就是规定了查询条件,字段值必须等于括号里传入的所有字段值的其中一个跟写一堆or是一个效果你不能把or作为参数传入
解决方案八:
十分怀疑你的a.cu在数据库里的类型应该是int,不然就算传了字符串最多就得不到结果,不会出错的。
解决方案九:
试试这个:declare@cuidvarchar(200),@doctypeintset@cuid='1,2,3,4,5‘set@doctype=1selecta.*,b.flow_name,c.node_name,c.node_type_id,c.node_order_id,c.node_next_idfromt_doca,t_flowb,t_nodecwherea.df=0andcharindex(','+rtrim(a.cu)+',',','+@cuid+',')>0anda.stin(0,1,2,4)anda.doc_type=@doctypeanda.flow_id*=b.flow_idanda.node_id*=c.node_idorderbya.doc_iddesc99%成功,成功了分给我。其他的回答理论一大堆,来的实际的行不?