Как сделать вставку только для столбцов с нулевым значением
I have a routine that checks for rows with NULL values, for a specified column. For each instance of a NULL value found i would like to insert values in the same using some criteria. Im getting a "There is already an open DataReader associated with this Command which must be closed first" exception. This is thrown when control flow has already surpassed the first INSERT condition.. but however when i check the table nothing has been committed. I was expecting to see data for the first condition despite of the exception. I need help on 1) if im doing the NULL check as well as insert correctly. For now i can observe that nothing is being committed. 2) I have checked and still cant see any datareader i have left unclosed.
Мой код:
using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect)) { SqlCommand cmd = new SqlCommand("SELECT DISTINCT transdetail_id FROM Tdata WHERE period_name='" + (reportingPeriod) + "' AND agent_shortname IS NULL", conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Models.FileUpload.Mapping mapping = new Models.FileUpload.Mapping(); mapping.TransactionDetailId = Convert.ToString(dr["transdetail_id"]); using (SqlConnection conn1 = new SqlConnection(Helpers.DatabaseConnect)) { SqlCommand cmd1 = new SqlCommand("SELECT company_code FROM TData WHERE transdetail_id='" + Convert.ToString(mapping.TransactionDetailId) + "'", conn1); conn1.Open(); SqlDataReader dr1 = cmd1.ExecuteReader(); if (dr1.Read() == true) { mapping.companycode = Convert.ToString(dr1["company_code"]); if (mapping.companycode == Harare) { using (SqlConnection connp = new SqlConnection(Helpers.DatabaseConnect)) { cmd.CommandText = @"INSERT INTO TData(agent_shortname) VALUES(@agentanalysiscode) WHERE transdetail_id='" + Convert.ToString(mapping.TransactionDetailId) + "'"; cmd.Parameters.AddWithValue("@agentanalysiscode", HreCode); try { connp.Open(); cmd.ExecuteNonQuery(); } catch (SqlException e) { ViewBag.ErrorMessage = "Processing error !"; return View(); } connp.Close(); } } //else if (mapping.companycode == Bulawayo) //insert different value based on company_code i.e Bulawayo } conn1.Close(); } } conn.Close(); }
Что я уже пробовал:
Когда я выполняю SQL запрос
SELECT transdetail_id FROM TData WHERE (agent_shortname IS NULL)в SSMS я могу получить transdetail_id для нулевых столбцов:
Просто для ясности все мои колонки-это nvarchar(MAX). Любая помощь в том, что я могу упустить.
Richard Deeming
"SELECT DISTINCT transdetail_id FROM Tdata WHERE period_name='" + (reportingPeriod) + "' AND agent_shortname IS NULL"
Не делай этого так!
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]