2013-05-21 8 views
3

У меня есть база данных в MySQL Workbench с такими полями, как (имя, фамилия, возраст, адрес и т. Д.) И приложение рабочего стола Windows (форма) в visual studio с C#, где вы можете вставить, поиск и обновление. Когда я вставляю данные из формы и оставляю поля пустыми, они сохраняются в базе данных как пустые, и я хочу, чтобы они были сохранены как null. Есть ли способ сделать это?Вставить нулевое значение в базу данных

Вот и кнопка вставки кода:

conn = openconnection.GetConn(); 

MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,lastname,address, etc...) VALUES (' " + name_textbox.Text + " ',' " + lastname_textbox.Text + " ' etc...);", conn); 

cmd.CommandType = CommandType.Text; 
cmd.ExecuteNonQuery(); 
conn.Close(); 

Большое спасибо, это работает отлично, но у меня есть проблема со словами с пробелами, например: (имя отца, имя матери и т.д.). Когда я вставляю значение по имени, это нормально, но когда я вставляю значение в имя отца или имя матери, оно равно null. Я думаю, это из-за пространства между словами.

MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,`father name`,`mother name`, etc... VALUES (@name,@`father name`,@`mother name`,etc...);", conn); 

cmd.Parameters.AddWithValue("@name", name_textbox.Text.NullString()); 
cmd.Parameters.AddWithValue("@`father name`", father_name_textbox.Text.NullString()); 
cmd.Parameters.AddWithValue("@`mother name`", mother_name_textbox.Text.NullString()); 

cmd.ExecuteNonQuery(); 
+0

Прежде чем что-либо делать, вы должны прочитать [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection). – canon

ответ

9

Одним из способов было бы просто сделать интерпретацию по своему усмотрению:

string.IsNullOrEmpty(name_textbox.Text) ? null : string.Format("'{0}'", name_textbox.Text); 

Однако, я хочу дать вам еще один вариант:

using (MySqlConnection conn = openconnection.GetConn()) 
{ 
    using (MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,lastname,address) VALUES (@name,@lastname,@address);", conn); 
    { 
     cmd.Parameters.AddWithValue("@name", name_textbox.Text.NullString()); 
     cmd.Parameters.AddWithValue("@lastname", lastname_textbox.Text.NullString()); 
     cmd.Parameters.AddWithValue("@address", address_textbox.Text.NullString()); 

     cmd.ExecuteNonQuery(); 
    } 
} 

namespace System 
{ 
    public static class StringExtensions 
    { 
     public static string NullString(this string s) 
     { 
      return string.IsNullOrEmpty(s) ? null : s; 
     } 
    } 
} 

С помощью этого решения вы будете должным образом удалять объекты соединения и команды, но вы также сможете упорядочить строку до null процесса и рычаг подготовлен запросов, чтобы упростить процесс и, поскольку он не открыт для SQL-инъекции.

ПРИМЕЧАНИЕ: Статический класс, который вы видите, должен быть помещен в его собственный файл .cs.

+0

Отличный ответ, +1. – Brian

+0

Имеет ли 'SqlParameterCollection.AddWithValue (имя, значение)' перегрузку, которая принимает только один аргумент? – canon

+0

@canon, да, вы правы, просто опечатка. Спасибо, что поймал это, я отредактировал ответ! –

-1

Хотя столбцы отображаются как пробелы в базе данных, они фактически являются нулевыми. Вы можете проверить это, прочитав эти поля на C# и сравнив их с System.DBNull.

+3

Фактически, если пустое строковое значение текстового поля было отправлено в базу данных, оно буквально сохранит пустую строку, которая сильно отличается от «null». –

1

Мне нравится использовать эту отличную функцию для тестирования/вставки DBNull.Value.

public static object ToDBNull(object value) 
    { 
     if (null != value) 
      return value; 
     return DBNull.Value; 
    } 

Полезно в других местах, но для вашего случая:

MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,lastname,address, etc...)" + 
    "VALUES (' " + ToDBNull(name_textbox.Text) + " ',' " + ToDBNull(lastname_textbox.Text) + " ' etc...);", conn) 

Кроме того, вы должны рассмотреть вашу уязвимость к атакам SQL-инъекции и рассмотрят параметризованную команду SQL.

+0

Это не работает так, как вы думаете, что это делает ... Если mysql не имеет возможности интерпретировать null в кавычках. И он работает только со строками, а не с нулевыми значениями - и кажется, что строкам не нужна конструкция DBNull.value. –

Смежные вопросы