C# 将多个参数作为单个字符串变量传递给sql过程
从前端(studio 2008)开始,我将值传递给sql过程,如下所示: 字符串a=“你好”+“098765”+“世界”+“90.0909” 这是4个不同的值,我将它们连接成一个字符串a 现在我使用c#sqlCommand对象将这个字符串a传递给sql过程 现在,我如何在sql过程中检索这4个值,因为我创建了以下过程:C# 将多个参数作为单个字符串变量传递给sql过程,c#,sql-server-2005,procedures,C#,Sql Server 2005,Procedures,从前端(studio 2008)开始,我将值传递给sql过程,如下所示: 字符串a=“你好”+“098765”+“世界”+“90.0909” 这是4个不同的值,我将它们连接成一个字符串a 现在我使用c#sqlCommand对象将这个字符串a传递给sql过程 现在,我如何在sql过程中检索这4个值,因为我创建了以下过程: create procedure Proc_name (@concatenated_string varchar(100)) as insert into table1 valu
create procedure Proc_name (@concatenated_string varchar(100))
as
insert into table1 values(**how can i get those 4 values here**).
我使用了数组,但它不起作用。标准方法是在过程中使用四个参数:
create procedure Proc_name (@param1 varchar(100),
@param2 varchar(100),
@param3 varchar(100),
@param4 varchar(100))
as
insert into table1 values(@param1, @param2, @param3, @param4)
然后从您的代码(使用ADO.NET给出一个c#示例)
使用多个参数而不是1,例如:
CREATE PROCEDURE [dbo].[addUser]
@idRole int,
@userName varchar(255),
@password varchar(255)
AS
BEGIN
set nocount on
insert into userTbl ( idRole , userName , password )
VALUES ( @idRole , @userName , @password )
return scope_identity();
END
GO
如果要将数组传递到SQL Server以处理一个表上的“多行”更新,请阅读以下内容
如果希望通用存储过程更新任何表,则不要按照其他注释,您可以用逗号连接这4个字符串,并将其拆分回数据库 例如
如果您使用的是SQLServer2005,那么可能需要考虑将数据作为XML参数发送到存储过程。完美地解释了这个过程 下面是使用.NET3.5和C时代码外观的示例部分# //示例对象
[Serializable]
internal class MyClass
{
internal string Property1 { get; set; }
internal string Property2 { get; set; }
internal int Property3 { get; set; }
internal string Property4 { get; set; }
}
//样本序列化
internal static string SerializeObject<T>(T objectGraph)
{
StringBuilder sb = new StringBuilder();
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
writerSettings.Indent = true;
using (XmlWriter xmlWriter = XmlWriter.Create(sb, writerSettings))
{
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(String.Empty, String.Empty);
xs.Serialize(xmlWriter, objectGraph, ns);
}
return sb.ToString();
}
我假设您已经阅读了其他答案的建议,并且没有创建一般的“插入任何内容”存储过程,因为这是您可能做的最糟糕的事情之一
注意:这个代码是在记事本++中编写的,因此没有被测试。 如果你真的只想使用一个参数,那么可以考虑XML参数而不是字符串。
public List updatestedetails(int-SiteId,int-CategoryId,string[]值)
public List<T> updateSiteDetails<T>(int SiteId, int CategoryId, string[] values)
{
int temp = values.Count();
int Counter = 0;
List<T> SiteDetails = null;
var parameterData = new string[temp];
var para = new string[temp];
foreach (string value in values)
{
Counter =Counter++;
parameterData[Counter] = "@,value"+Counter;
para[Counter] = string.Format(","+value);
}
//string ParameterDatas=string.Join(",",parameterData);
string parameterValue = string.Join(",",para);
using (SBDEntities db = new SBDEntities())
{
SiteDetails = db.Database.SqlQuery<T>("Sp_Update_Data @SiteId,@CategoryId" + string.Join(",", parameterData),string.Join(",",para)
//new Object[] { new SqlParameter("@SiteId", SiteId),
// new SqlParameter("@CategoryId",CategoryId)}
).ToList();
}
return SiteDetails;
}
{
int temp=values.Count();
int计数器=0;
List SiteDetails=null;
var参数data=新字符串[temp];
var para=新字符串[temp];
foreach(值中的字符串值)
{
计数器=计数器++;
参数数据[计数器]=“@,值”+计数器;
para[Counter]=string.Format(“,”+值);
}
//string ParameterDatas=string.Join(“,”,parameterData);
字符串参数value=string.Join(“,”,para);
使用(SBDEntities db=new SBDEntities())
{
SiteDetails=db.Database.SqlQuery(“Sp_Update_Data@SiteId,@CategoryId”+string.Join(“,”,parameterData),string.Join(“,”,para)
//新对象[]{new SqlParameter(@SiteId),SiteId),
//新的SqlParameter(“@CategoryId”,CategoryId)}
).ToList();
}
返回网站详情;
}
如果将存储过程与实体框架一起使用为什么不在该过程中使用四个参数呢?听起来像是要创建一个通用的“插入”过程来处理各种不同表的所有插入。如果是这样-为什么?!?!?您在代码质量(速度、可读性)方面一无所获,造成了严重的安全问题,并且通常会使每个人的生活变得困难。您的字符串中没有分隔符,它最终成为hello098765world90.0909,这是毫无意义的。至少如果你把|、、、或任何东西放在中间,那么你就有机会把它分开……好吧,如果我把逗号作为分隔符,那么如何处理数组(虽然人们说不要使用泛型过程,但我还是想知道如何处理数组)使用EnterpriseLibrary,这会变得更干净。
internal static string SerializeObject<T>(T objectGraph)
{
StringBuilder sb = new StringBuilder();
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
writerSettings.Indent = true;
using (XmlWriter xmlWriter = XmlWriter.Create(sb, writerSettings))
{
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(String.Empty, String.Empty);
xs.Serialize(xmlWriter, objectGraph, ns);
}
return sb.ToString();
}
Create PROCEDURE [dbo].[MyProc]
@myClassXML XML
AS
BEGIN
INSERT INTO [dbo].[MyTable]
(
P1,
P2,
P3,
P4
)
SELECT
Container.ContainerCol.value('Property1[1]', 'varchar(50)') AS P1,
Container.ContainerCol.value('Property2[1]', 'varchar(50)') AS P2,
Container.ContainerCol.value('Property3[1]', 'int') AS P3,
Container.ContainerCol.value('Property4[1]', 'varchar(50)') AS P4,
FROM @myClassXML.nodes('//MyClass') AS Container(ContainerCol)
END
public List<T> updateSiteDetails<T>(int SiteId, int CategoryId, string[] values)
{
int temp = values.Count();
int Counter = 0;
List<T> SiteDetails = null;
var parameterData = new string[temp];
var para = new string[temp];
foreach (string value in values)
{
Counter =Counter++;
parameterData[Counter] = "@,value"+Counter;
para[Counter] = string.Format(","+value);
}
//string ParameterDatas=string.Join(",",parameterData);
string parameterValue = string.Join(",",para);
using (SBDEntities db = new SBDEntities())
{
SiteDetails = db.Database.SqlQuery<T>("Sp_Update_Data @SiteId,@CategoryId" + string.Join(",", parameterData),string.Join(",",para)
//new Object[] { new SqlParameter("@SiteId", SiteId),
// new SqlParameter("@CategoryId",CategoryId)}
).ToList();
}
return SiteDetails;
}