C# 将多个参数作为单个字符串变量传递给sql过程

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

从前端(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 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;
        }