2014-01-09 2 views
0

Hie.Хранить нулевое целое значение изнутри C# app

Так что я пытаюсь вставить нулевое значение в целочисленный столбец в MySQL с помощью приложения C#.

Я знаю, что запрос, как правило, делает такую ​​вещь;

INSERT INTO Database.Table (IntColumn) VALUES (NULL); 
UPDATE Database.Table set IntColumn = (NULL) where id = '1'; 

Он отлично работает в верстаке. Дело в том, что я даже не уверен, возможно ли это, но мне нужно сделать это на C#, все еще позволяя текстовому блоку гибко вводить целые числа в базу данных MySQL. В этом случае «home.text», который связан с столбцом «home» в MySQL, который является целым полем.

Вот как я сделал свой код.

using MySql.Data.MySqlClient; 
    using MySql.Data; 

    namespace Masca.Content 
    { 

/// <summary> 
/// Interaction logic for Login.xaml 
/// </summary> 
public partial class Login : UserControl 
{ 
    //Function to check if column value is null before fetching string 

    public static string GetString(MySqlDataReader reader, string colName) 
    { 
     if (reader[colName] == DBNull.Value) 
      return string.Empty; 
     else 
      return (string)reader[colName]; 
    } 

    //Function to check if column value is null before fetching int as string 
    public static string GetColumnValueAsString(MySqlDataReader reader, string colName) 
    { 
     if (reader[colName] == DBNull.Value) 
      return string.Empty; 
     else 
      return reader[colName].ToString(); 
    } 

    public Login() 
    { 
     InitializeComponent(); 

    } 

    public void save_Click(object sender, RoutedEventArgs e) 
    { 
    //Authentication parameters 
     string sqlcon = "datasource = localhost; port = 3306; username = root; password = root"; 
    //Query to excecute 
     string queryadd = "insert into users.employees (member, username, password, question, answer, first, second, third, surname, dob, gender, doc, dept, cell, home, work, email, pemail, street, surbub, city, region, position, access, privilages, bank, account) values ('" + this.member.Text + "','" + this.username.Text + "','" + this.password.Text + "', '" + this.question.Text + "','" + this.answer.Text + "', '" + this.first.Text + "','" + this.second.Text + "','" + this.third.Text + "','" + this.surname.Text + "', '" + this.dob.Text + "','" + this.gender.Text + "', '" + this.doc.Text + "', '" + this.dept.Text + "', '" + this.cell.Text + "','" + this.home.Text + "', '" + this.work.Text + "', '" + this.email.Text + "', '" + this.pemail.Text + "', '" + this.street.Text + "', '" + this.surbub.Text + "', '" + this.city.Text + "', '" + this.region.Text + "', '" + this.position.Text + "', '" + this.access.Text + "', '" + this.privilages.Text + "', '" + this.bank.Text + "', '" + this.account.Text + "') ; insert into logon.login (username, password) values ('" +this.username.Text+ "', '" +this.password.Text+ "'); select * from users.employees where member = '" + this.member.Text + "' ;"; 

     MySqlConnection con = new MySqlConnection(sqlcon); 

     MySqlDataReader rdr; 

     MySqlCommand cmd = new MySqlCommand(queryadd, con); 

    // Excecution 
      try 
      { 
       con.Open(); 
       rdr = cmd.ExecuteReader(); 
       MessageBox.Show("Saved"); 
       while (rdr.Read()) 
       { 
        //Declarations using function 

        string stag = GetColumnValueAsString(rdr, "tag"); 
        string snumber = GetColumnValueAsString(rdr, "tag"); 
        string smember = GetColumnValueAsString(rdr, "member"); 

        string susername = GetString(rdr, "username"); 
        string spassword = GetString(rdr, "password"); 

        string ssecurity = GetString(rdr, "question"); 
        string sanswer = GetString(rdr, "answer"); 

        string sfirst = GetString(rdr, "first"); 
        string ssecond = GetString(rdr, "second"); 
        string sthird = GetString(rdr, "third"); 
        string sfourth = GetString(rdr, "surname"); 

        string sdob = rdr.GetString("dob"); 
        string sgender = rdr.GetString("gender"); 
        string sdoc = rdr.GetString("doc"); 

        string sdept = rdr.GetString("dept"); 

        string scell = GetColumnValueAsString(rdr, "cell"); 
        string shome = GetColumnValueAsString(rdr, "home"); 
        string swork = GetColumnValueAsString(rdr, "work"); 
        string semail = GetString(rdr, "email"); 
        string spemail = GetString(rdr, "pemail"); 

        string sstreet = GetString(rdr, "street"); 
        string ssurbub = GetString(rdr, "surbub"); 
        string scity = GetString(rdr, "city"); 
        string sregion = GetString(rdr, "region"); 

        string sposition = GetString(rdr, "position"); 
        string saccess = GetString(rdr, "access"); 
        string sprivilages = GetString(rdr, "privilages"); 
        string sbank = GetString(rdr, "bank"); 
        string saccount = GetString(rdr, "account"); 

        //Binding strings to textboxes 

        tag.Text = stag; 
        number.Text = stag; 
        member.Text = smember; 

        username.Text = susername; 
        password.Text = spassword; 

        question.Text = ssecurity; 
        answer.Text = sanswer; 

        first.Text = sfirst; 
        second.Text = ssecond; 
        third.Text = sthird; 
        surname.Text = sfourth; 

        dob.Text = sdob; 
        gender.Text = sgender; 

        doc.Text = sdoc; 
        dept.Text = sdept; 

        cell.Text = scell; 
        home.Text = shome; 
        work.Text = swork; 
        email.Text = semail; 
        pemail.Text = spemail; 

        street.Text = sstreet; 
        surbub.Text = ssurbub; 
        city.Text = scity; 
        region.Text = sregion; 

        position.Text = sposition; 
        access.Text = saccess; 


        privilages.Text = sprivilages; 
        bank.Text = sbank; 
        account.Text = saccount; 
       } 


      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

Это код, содержащий форму, содержащую сведения о сотрудниках. home.text должен содержать номер домашней линии. Предполагая, что у сотрудника нет наземной линии дома, они оставят поле пустым.

Каждый раз, когда я это делаю, я получаю исключение, в котором вызывается «Неправильное целочисленное значение». Чтобы оставить его пустым в базе данных, мне нужно было бы ввести (NULL), где «this.home.text» в настоящее время находится в запросе. Если я это сделаю, я не смогу вставлять информацию в базу данных, используя home.text, когда это необходимо.

Любой способ сделать это?

+1

Используйте sql-параметры вместо конкатенации строк, чтобы предотвратить SQL-инъекцию. –

+1

Вы можете использовать 'Nullable ' или 'int?' Для сопоставления столбца с нулевым числом. – Dirk

ответ

1

Вставить Обычную преамбулу о том, что ваш SQL открыт для инъекционных атак (см. this question для получения дополнительной информации о параметризованном SQL).

Проблема в том, что вы вставляете строки во все столбцы, независимо от базового типа базы данных.

это:

'" + this.home.text + "'

Если пусто, будет производить '', который не может быть преобразован в целое число. Вы можете попробовать что-то вроде:

int? homeNumber = null; // Note the int? is syntactic sugar for Nullable<int> 
if(!string.IsNullOrEmpty(home.text)) 
    homeNumber = Convert.ToInt32(home.Text); 

И вставить таким образом:

," + homeNumber + ", .... и т.д.

0

Вы могли бы попробовать что-то вдоль линий

if (!int.TryParse(shome, out home.Text)) 
    home.Text = null; 
0

I Вместо этого вы должны просто проверить наличие пустых или null строк,

string queryadd = "insert into users.employees (member, username, password, question, answer, first, second, third, surname, dob, gender, doc, dept, cell, home, work, email, pemail, street, surbub, city, region, position, access, privilages, bank, account) values ('" 
        + this.member.Text + "','" + this.username.Text + "','" + this.password.Text + "', '" + this.question.Text + "','" + this.answer.Text + "', '" + this.first.Text + "','" + this.second.Text + "','" + this.third.Text 
        + "','" + this.surname.Text + "', '" + this.dob.Text + "','" + this.gender.Text + "', '" + this.doc.Text + "', '" + this.dept.Text + "', '" + this.cell.Text + "','" 
        + string.IsNullOrWhiteSpace(this.home.Text) ? null : this.home.Text + "', '" 
        + this.work.Text + "', '" + this.email.Text + "', '" + this.pemail.Text + "', '" + this.street.Text + "', '" + this.surbub.Text + "', '" + this.city.Text + "', '" + this.region.Text + "', '" + this.position.Text + "', '" 
        + this.access.Text + "', '" + this.privilages.Text + "', '" + this.bank.Text + "', '" + this.account.Text 
        + "') ; insert into logon.login (username, password) values ('" + this.username.Text + "', '" + this.password.Text + "'); " 
        + " select * from users.employees where member = '" + this.member.Text + "' ;"; 

взгляд на string.IsNullOrWhiteSpace(this.home.Text) ? null : this.home.Text

Я не думаю, что так SQL, что вы создали правильно и будет работать, как это, т.е.два SQL, разделенных ;, а также имеет SELECT SQL, объединенный с INSERT

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