如何在c#中的foreach循环中将数据插入sql server

时间:2014-05-14 10:18:28

标签: c# sql sql-server

我正在为一些类做我的最终项目。在大多数测试用例中,我将被要求将大量记录插入到数据库中,记录将在xml文件中给出。我的问题是如何将xml中的所有记录插入到数据库中,因为我尝试过的东西没有用。这是我到目前为止所做的:

我正在从存储过程中插入(这确实是最终的要求所以我不能进行批量插入)

C#

XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(IdeaEvaluation.Properties.Resources.Cities);

XmlNode root = xmldoc.DocumentElement;
XmlNodeList nodeList = root.SelectNodes("/Ciudades/Ciudad");

string nombre = string.Empty;
string codigo_postal = string.Empty;

foreach (XmlNode node in nodeList)
{
    nombre = node["nombre"].InnerText;
    codigo_postal = node["codigo_postal"].InnerText;

    try
    {
        using (SqlCommand cmd = new SqlCommand("dbo.CreateCiudad", conn) { CommandType = CommandType.StoredProcedure })
        {
            cmd.Parameters.Add("@nombre", SqlDbType.VarChar, 10).Value = nombre;
            cmd.Parameters.Add("@codigo_postal", SqlDbType.VarChar, 6).Value = codigo_postal;
            string text = cmd.CommandText;
            cmd.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

一切正常,直到它执行插入然后我不知道会发生什么,它永远不会插入一行或任何东西..我相信这是因为它没有时间做插入作为循环继续非常快地循环。

这是存储过程

   CREATE PROC Createciudad(@nombre        VARCHAR, 
                         @codigo_postal VARCHAR) 
AS 
  BEGIN 
      IF NOT EXISTS(SELECT * 
                    FROM   dbo.codigo_postal 
                    WHERE  codigo_postal = @codigo_postal) 
        INSERT INTO dbo.codigo_postal 
                    (codigo_postal) 
        VALUES      (@codigo_postal); 

      IF NOT EXISTS(SELECT * 
                    FROM   dbo.ciudad 
                    WHERE  nombre = @nombre 
                           AND codigo_postal = @codigo_postal) 
        INSERT INTO dbo.ciudad 
                    (nombre, 
                     codigo_postal) 
        VALUES      (@nombre, 
                     @codigo_postal); 
  END; 

关于如何在foreach循环中插入数据或我应该使用其他类型的循环或方法的任何想法?

1 个答案:

答案 0 :(得分:1)

您需要定义参数的长度,否则它们将被赋予默认长度1个字符

CREATE PROC Createciudad(@nombre        VARCHAR(50), 
                     @codigo_postal VARCHAR(50))