Невозможно добавить или обновить простую строку в таблице SQL Server - PullRequest
0 голосов
/ 12 августа 2011

Исходя из фона БД Access, использующего операторы выбора SQL, я обнаружил, что требуется проделать большую работу по загрузке данных в базу данных SQL Server и обновлению записей.Мое первоначальное понимание добавления записей в SQL Server потребовало оператора VERY LONG, который включал команду INSERT.Мне кажется, что это излишне сложно, и я должен верить, что с .NET сегодня это должно быть намного проще.

Я исследовал и рассмотрел несколько примеров кода для DataTable, DataSet, SqlCommand, SqlAdapters и т. Д. Ни одна из них не работает для меня, несмотря на то, что в моем коде нет ошибок.Я прошел через множество мутаций в этих примерах, и обращаюсь к Stack Overflow за помощью.

Вот что я пытаюсь сделать.

  1. Подключение к SQL Serverразмещен снаружи (работает!)
  2. Откройте одну таблицу с именем Dongles.
  3. Проверьте строку, используя серийный номер в качестве критерия.
  4. Если он существует, ОБНОВИТЬзапись.
  5. Если нет, то ДОБАВЬТЕ новую запись.

Я предоставляю последнюю мутацию образцов кода, с которыми я работал.Перед запуском кода я вручную добавил 1 запись в базу данных, чтобы узнать, совпадает ли аргумент SerialNumber.К сожалению, оператор if (dt.Rows.Count > 0) возвращает false, и обновление никогда не предпринимается.

Теперь я расскажу вам об этом ... Я пробовал другие мутации, которые успешно прошли через строки, которые обновляют каждое поле.Но когда функция Update () была вызвана (успешно), в действительную базу данных ничего не было передано.

Вот код:

SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = " + m_dongle.SerialNumber, server.SQLConnection);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);

DataTable dt = new DataTable();
da.Fill(dt);

if (dt.Rows.Count > 0)
{
   dt.Rows[0]["IsLeased"] = m_dongle.IsLeased == true ? 1 : 0;
   dt.Rows[0]["LeaseDaysRemaining"] = m_dongle.LeaseDaysRemaining;
   dt.Rows[0]["DateAssigned"] = DateTime.Now;
   dt.Rows[0]["ConfiguredBy"] = m_dongle.ConfiguredBy;
   dt.Rows[0]["LicenseHolder"] = m_dongle.LicenseHolder;
   dt.Rows[0]["ContactName"] = m_dongle.ContactName;
   dt.Rows[0]["ContactPhone"] = m_dongle.ContactPhone;
   dt.Rows[0]["ContactEmail"] = m_dongle.ContactEmail;
   dt.Rows[0]["SerialNumber"] = m_dongle.SerialNumber;
   dt.Rows[0]["IsNetworkDongle"] = m_dongle.IsNetworkDongle;
   dt.Rows[0]["NetworkMaxUsers"] = m_dongle.NetworkMaxUsers;
   dt.Rows[0]["NetworkAbsoluteMaxUsers"] = m_dongle.NetworkAbsoluteMaxUsers;
   dt.Rows[0]["IsAssigned"] = m_dongle.IsAssigned;
   dt.Rows[0]["DongleModel"] = m_dongle.DongleModel;
   dt.Rows[0]["SalesforceID"] = m_dongle.SalesforceID;

   da.Update(dt);

   MessageBox.Show("Dongle profile updated successfully.", "Profile Saved", 
                   MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}

1 Ответ

4 голосов
/ 12 августа 2011

Что за столбец SerialNumber ?? Если это строковый столбец, вам нужно будет заключить в кавычки параметр - и пока вы его используете, чтобы предотвратить атаки SQL-инъекций - используйте параметризованные запросы вместо объединения вместе своих операторов SQL ... ( как дополнительное преимущество, параметры будут автоматически использовать кавычки вокруг значений, где это необходимо):

SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = @SerialNo", server.SQLConnection);

cmd.Parameters.Add("@SerialNo", SqlDbType.VarChar, 50).Value = m_dongle.SerialNumber.Trim();

SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);

DataTable dt = new DataTable();
da.Fill(dt);

if (dt.Rows.Count > 0)
{
    .......
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...