C# - Обновить SQL таблицу с данными из XML файла - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь с помощью C# прочитать данные из файла XML и обновить таблицу SQL с помощью. Но ничего не происходит.

Мой XML выглядит так

<User>
  <Table>
    <userID>535631</userID>
    <Date>2017-12-18</Date>
  </Table>
  <Table>
    <userID>36334</userID>
    <Date>2020-02-03</Date>
  </Table>
  <Table>
    <userID>734563</userID>
    <Date>2020-02-03</Date>
  </Table>
  <Table>
    <userID>6334</userID>
    <Date>2020-02-21</Date>
  </Table>
</User>

И что я пытался:

        XmlDocument doc = new XmlDocument();
        doc.Load(@"C:\\temp\\data\\myData.xml");
        XmlNodeList node = doc.SelectNodes("/User/Table");


        string source = ConfigurationManager.ConnectionStrings["JBVRM"].ConnectionString;
        SqlConnection conn = new SqlConnection(source);
        SqlCommand cmd = new SqlCommand();

        foreach (XmlNode xn in node)
        {

            string userID = xn["userID"].InnerText;
            string NewDate= xn["Date"].InnerText;

            SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter("UPDATE [dbo].[User] SET Date='"+NewDate+"' WHERE UserID="+ userID , source);

             conn.Close();

            //  Console.WriteLine(userID+" "+Date); // This prints everything very fine. 

        }

Есть какие-нибудь предложения, что я делаю не так? Я могу напечатать дату и идентификатор пользователя. но моя таблица не обновляется.

РЕШЕНИЕ Благодаря @Magnetron и @ Gnud

            using (SqlConnection connection = new SqlConnection(source))
            {
                using (SqlCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = "UPDATE [dbo].[User] SET Date=@Date WHERE userID=@userID";

                    cmd.Parameters.AddWithValue("@Date", xn["Date"].InnerText);
                    cmd.Parameters.AddWithValue("@userID", xn["userID"].InnerText);
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();
                }
            }

1 Ответ

1 голос
/ 26 марта 2020

В вашем коде есть пара неправильных вещей.

  • Вы должны всегда использовать SQL параметры вместо запирания значений в строку SQL. Это важно . Построение SQL строк, как вы делаете, является рецептом для дыр в безопасности.
  • Вы должны действительно обернуть свои SqlConnection и свои SqlCommand в using заявления . Соединения с базой данных - это ресурсы, которые вы хотите освободить, как только закончите с ними.
  • Не следует использовать SqlDataAdapter, если вы не работаете с классами DataSet или DataTable. Вы не делаете этого в своем коде, и нет никаких оснований для этого.
  • Вы действительно не должны закрывать соединение с базой данных внутри l oop. Затем соединение будет закрыто, когда вы попытаетесь обработать 2-й элемент "table" из файла XML.

После исправления это обновление l oop может выглядеть примерно так:

using(var conn = new SqlConnection(source))
using(var cmd = conn.CreateCommand()) {
    conn.Open();

    cmd.CommandText = "UPDATE [dbo].[User] SET [Date]=@date WHERE [UserId]=@id";
    cmd.Prepare();

    var date = cmd.CreateParameter();
    date.ParameterName = "@date";
    date.DbType = DbType.Date;

    var id = cmd.CreateParameter();
    id.ParameterName = "@id";
    id.DbType = DbType.Int32;

    cmd.Parameters.Add(date);
    cmd.Parameters.Add(id);

    foreach (XmlNode xn in node)
    {                
            id.Value = int.Parse(xn["userID"].InnerText);
            date.Value = DateTime.ParseExact(xn["Date"].InnerText, "yyyy-MM-dd", CultureInfo.InvariantCulture);

            cmd.ExecuteNonQuery();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...