2

从前端(工作室 2008)我将值传递给 sql 过程:

字符串 a =“你好”+“098765”+“世界”+“90.0909”

这些是我连接成字符串 a 的 4 个不同的值;

现在我使用 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**).

我使用了数组,但它没有用。

4

7 回答 7

6

如果要将数组传递到 SQL Server 以处理一个表上的“多行”更新,请阅读这篇著名的文章。

如果您想要一个通用的存储过程来更新任何表,那么不要按照其他评论

于 2010-01-28T06:38:34.617 回答
5

执行此操作的标准方法是在过程中使用四个参数:

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 给出 ac# 示例)

using (SqlConnection connection = new SqlConnection(connectionString))
{
    // Create the command and set its properties.
    SqlCommand command = new SqlCommand();
    SqlCommand command = new SqlCommand 
       ("Proc_name", connection); 

    command.CommandType = CommandType.StoredProcedure;

    // Add the input parameters and set the properties.
    SqlParameter parameter1 = new SqlParameter();
    parameter.ParameterName = "@Param1";
    parameter.SqlDbType = SqlDbType.NVarChar;
    parameter.Direction = ParameterDirection.Input;
    parameter.Value = param1;

    SqlParameter parameter2 = new SqlParameter();
    parameter.ParameterName = "@Param2";
    parameter.SqlDbType = SqlDbType.NVarChar;
    parameter.Direction = ParameterDirection.Input;
    parameter.Value = param2;

    // Same for params 3 and 4...


    // Add the parameter to the Parameters collection. 
    command.Parameters.Add(parameter1);
    command.Parameters.Add(parameter2);
    command.Parameters.Add(parameter3);
    command.Parameters.Add(parameter4);


    // Open the connection and execute the reader.
    connection.Open();
    SqlDataReader reader = command.ExecuteNonQuery();

    reader.Close();
}
于 2010-01-28T05:08:47.157 回答
4

如果您使用的是 SQL Server 2005,那么您可能希望将数据作为 XML 参数发送到您的存储过程。这个链接完美地解释了这个过程

下面是使用 .NET 3.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();   
}  

// 示例存储过程

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

我假设您已经阅读了此处其他答案的建议,并且没有创建通用的“插入任何内容”存储过程,因为这是您可以做的最糟糕的事情之一。

注意:此代码是用 Notepad++ 编写的,因此未经测试。

于 2010-01-28T06:51:35.757 回答
1

使用多个参数而不是 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
于 2010-01-28T05:09:29.027 回答
1

您可以用逗号连接这 4 个字符串,然后将其拆分回数据库中。

例如

declare @values as nvarchar(1000)
set @values = 'hello,098765,world,90.0909'
SELECT * FROM split(@values) 

----------------  SPLIT FUNCTION  --------------
CREATE FUNCTION [dbo].[split]
(
    @csv nvarchar(max)
)
RETURNS 
@entries TABLE 
(
    entry nvarchar(100)
)
AS
BEGIN
    DECLARE @commaindex int
    SELECT @commaindex = CHARINDEX(',', @csv)

    IF @commaindex > 0 
    BEGIN
        INSERT INTO @entries
        -- insert left side
        SELECT LTrim(RTrim(LEFT(@csv, @commaindex-1)))
        -- pass right side recursively
        UNION ALL
        SELECT entry
        FROM dbo.split(RIGHT(@csv, LEN(@csv) - @commaindex))        
    END
    ELSE
        INSERT INTO @entries
        SELECT LTrim(RTrim(@csv))

    RETURN
END
于 2010-01-28T06:46:23.147 回答
0

如果您真的只想使用一个参数,那么可以考虑使用 XML 参数而不是字符串。

于 2010-01-28T12:40:00.993 回答
0
 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;
        }     

如果您在实体框架中使用存储过程

于 2017-08-04T11:47:55.817 回答