如何将ArrayList值传递给C#中的存储过程 [英] How to pass ArrayList values to Stored Procedure in C#

查看:147
本文介绍了如何将ArrayList值传递给C#中的存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好。任何人都可以帮我解决如何使用C#将ArrayList值传递给存储过程,我的数据库是sql server吗?



提前谢谢你

解决方案

如果您明智地使用它,此代码可以保存对数据库的无数次调用。因为我老了又慢了,所以我花了很多钱才能最终使它工作,但它现在是我最喜欢的代码之一。



我解决了这个问题通过向SQL Server 2005发送xml文件来解决问题。



我似乎总是从sproc向后工作,所以在这里。



这里的诀窍是创建临时表,然后将xml文件数据插入临时表,然后将其连接到要更新的表。请记住最后删除临时表。如果你不这样做,你的数据库会在下次运行程序时抱怨已经有一个带有该名称的表格。



  set   ANSI_NULLS   ON  
< span class =code-keyword> set QUOTED_IDENTIFIER ON
go


创建 程序 [Update_XML]

@ xmlData xml


AS

CREATE TABLE ## xData(
item1 bigint
item2 smalldatetime
item3 money
item4 bigi nt
item5 位<​​/ span>



BEGIN

INSERT INTO ## xData( item1,item2,item3,item4,item5)
SELECT
xdvalue(' item1 [1]'' BIGINT' AS item1,
xdvalue(' item2 [1]'' SMALLDATETIME' AS item2,
xdvalue(' item3 [1]'' MONEY' AS item3,
xdvalue(' item4 [1]'' BIGINT' AS item4,
xdvalue(' item5 [1]'' BIT' AS item5

FROM @ xmlData .nodes(' // NewDataSet / Selected')x(d)

END

BEGIN TRAN 更新


BEGIN
更新 tblone
SET tblone.item2 = ## xData.item2,
tblone .item4 = ## xData.item4,
tblone.item5 = ## xData.item5,
tblone.item3 = ## xData.item3

FROM ## xData < span class =code-keyword> JOIN
tblone ON tblone.item1 = ## xData.item1
WHERE tblone.item1 = ## xData.item1
END

DROP ## xData


IF @@ ERROR<> 0
BEGIN
ROLLBACK < span class =code-keyword> TRAN
update
RETURN -1
END
ELSE
BEGIN
COMMIT T RAN update
RETURN 0
END







然后我使用以下代码将xml文件发送到DB。我应该提到我没有显示我的dbObject代码,下面的代码调用它来发送它,所以你必须构建自己的参数和连接字符串等。



  public   bool  Processxmlfile( string  xmlDoc)
{
bool functionReturnValue = false ;

functionReturnValue = false ;

SqlParameter [] parameters = { new SqlParameter( @ xmlData,SqlDbType.Xml)};

参数[ 0 ]。Value = xmlDoc;


int rowsAffected = 0 ;
尝试
{
RunProcedure( Update_XML,参数,rowsAffected);

functionReturnValue = true ;
}
catch (Exception ex)
{
ex.ToString();
functionReturnValue = false ;
}

return functionReturnValue;

}







我假设您可以创建自己的数组列表所以下面的代码接收列表并使用上面的函数生成要发送到数据库的xml文件。





  public   string  createxmlfile(List< mylist> list)
{
字符串 rtnVal = 未处理;

String tXml;

StringWriter S = new StringWriter();

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true ;

使用(XmlWriter writer = XmlWriter.Create(S,settings))
{
// 开始写作。
writer.WriteStartDocument();
writer.WriteStartElement( NewDataSet);
// Root。

foreach (myList记录列表中)
{

writer.WriteStartElement( 已选择);


writer.WriteElementString( Item1,记录。 item1.ToString());
writer.WriteElementString( Item2,record.item2.ToString());
writer.WriteElementString( Item3,record.item3.ToString());
writer.WriteElementString( Item4,record.item4.ToString());
writer.WriteElementString( Item5,record.item5.ToString());


writer.WriteEndElement();

}

writer.WriteEndElement();
writer.WriteEndDocument();

} // 结束使用

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(S.ToString());

tXml = S.ToString();
// 将xml文件传递给数据对象
if (Processxmlfile(tXml))
{
rtnVal = 加工;
}

return rtnVal;
} < / mylist >







此处列出的链是完成链。



  public   class  myList 
{

public Int32 item1 {获得; set ; }
public DateTime item2 { get ; set ; }
public Double item3 { get ; set ; }
public Int32 item4 { get ; set ; }
public Boolean item5 { get ; set ; }
}





希望这对别人有用

干杯!


Hi all. Can anyone help me out how to pass the ArrayList values to stored procedure using C# and my database is sql server?

Thank you in advance

解决方案

This code can save countless calls to your db if you use it wisely. Because I am old and slow it took me a lot of scavenging to finally get it to work but it is now one of my favorite bits of code.

I solved this issue by sending SQL Server 2005 an xml file.

I always seem to work backwards from the sproc, so here it is.

The trick here is to create a temp table, then insert the xml file data into the temp table, then join it to the table(s) you want to update. Just remember to drop the temp table at the end. If you don't your db will complain that there is already a table with that name the next time you run the procedure.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


CREATE PROCEDURE [Update_XML]
	(
@xmlData xml
)

AS

CREATE TABLE ##xData (
item1 bigint,
item2 smalldatetime,
item3 money,
item4 bigint,
item5 bit
 )


BEGIN	

 INSERT INTO ##xData (item1, item2, item3, item4, item5)
SELECT
x.d.value('item1[1]', 'BIGINT') AS item1,
x.d.value('item2[1]', 'SMALLDATETIME') AS item2,
x.d.value('item3[1]', 'MONEY') AS item3,
x.d.value('item4[1]','BIGINT') AS item4,
x.d.value('item5[1]','BIT') AS item5

   FROM @xmlData.nodes('//NewDataSet/Selected') x(d)

END

BEGIN TRAN update
		

		BEGIN
		UPDATE    tblone
		SET			tblone.item2 = ##xData.item2, 
					tblone.item4 = ##xData.item4 , 
					tblone.item5  = ##xData.item5 , 
					tblone.item3  = ##xData.item3 

		FROM ##xData  JOIN tblone ON tblone.item1 = ##xData.item1
		WHERE tblone.item1 = ##xData.item1
		END

DROP TABLE ##xData 


IF @@ERROR<>0
    BEGIN
    	ROLLBACK TRAN update
    	RETURN -1
    END
    ELSE
    BEGIN
    	COMMIT TRAN update
    	RETURN 0	
	END




I then use the following code to send the xml file to the DB. I should mention I did not show my dbObject code that the below code calls to send this off so you will have to build out your own parameters and connections strings etc.

public bool Processxmlfile(string xmlDoc)
  {
      bool functionReturnValue = false;

      functionReturnValue = false;

      SqlParameter[] parameters = { new SqlParameter("@xmlData", SqlDbType.Xml) };

      parameters[0].Value = xmlDoc;


      int rowsAffected = 0;
      try
      {
          RunProcedure("Update_XML", parameters, rowsAffected);

          functionReturnValue = true;
      }
      catch (Exception ex)
      {
          ex.ToString();
          functionReturnValue = false;
      }

      return functionReturnValue;

  }




I am assuming you can create your own array list so the below code takes in the lists and generates the xml file to send to the db using the above function.


public string createxmlfile(List<mylist> list)
   {
       String rtnVal = "Not processed";

       String tXml;

       StringWriter S = new StringWriter();

       XmlWriterSettings settings = new XmlWriterSettings();
       settings.Indent = true;

       using (XmlWriter writer = XmlWriter.Create(S, settings))
       {
           // Begin writing.
           writer.WriteStartDocument();
           writer.WriteStartElement("NewDataSet");
           // Root.

           foreach (myList record in list)
           {

               writer.WriteStartElement("Selected");


               writer.WriteElementString("Item1", record.item1.ToString());
               writer.WriteElementString("Item2", record.item2.ToString());
               writer.WriteElementString("Item3", record.item3.ToString());
               writer.WriteElementString("Item4", record.item4.ToString());
               writer.WriteElementString("Item5", record.item5.ToString());


               writer.WriteEndElement();

           }

           writer.WriteEndElement();
           writer.WriteEndDocument();

       }//end using

       XmlDocument xdoc = new XmlDocument();
       xdoc.LoadXml(S.ToString());

       tXml = S.ToString();
       //pass xml file to data object
       if (Processxmlfile(tXml))
       {
           rtnVal = "Processed";
       }

       return rtnVal;
   }</mylist>




And to complete the chain here is the list.

public class myList
{

    public Int32 item1 { get; set; }
    public DateTime item2 { get; set; }
    public Double item3 { get; set; }
    public Int32 item4 { get; set; }
    public Boolean item5 { get; set; }
}



Hope this is of some use to others
Cheers!


这篇关于如何将ArrayList值传递给C#中的存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆