Сбой программы, если возвращаемое значение равно нулю - PullRequest
2 голосов
/ 13 января 2010

я пытаюсь получить некоторые данные из mysql (c #, mono), проблема в том, что если возвращаемое значение равно нулю, программа вылетает, я знаю, что она должна что-то делать с возвращенным нулевым значением, потому что если я хочуполучить что-то, что находится в базе данных, она работает, кто-нибудь может мне помочь с этим?

Код:

MySqlConnection dbcon;
dbcon = new MySqlConnection(conString);
try
{
    dbcon.Open();
}
catch (Exception)
{
    Console.WriteLine("MySQL Database Connection Problem !!!");

}

//reading data from mysql   
MySqlCommand dbcmd = new MySqlCommand(sql, dbcon);

MySqlDataReader reader = dbcmd.ExecuteReader();

while(reader.Read()){

    txtFirstname.Text = reader["first_name"].ToString();
    txtLastname.Text  = reader["last_name"].ToString();
    imgUser.File      = path+reader["photo"].ToString();
    expDate           = reader["expiration_datetime"].ToString();
    usrName           = reader["username"].ToString();

}

dbcon.Close();

Ответы [ 4 ]

2 голосов
/ 13 января 2010

Вы вызываете метод ToString для объектов, возвращаемых MySQL.

Если MySQL вернет null, вы вызовете метод ToString для объекта null, что даст NullReferenceException.

Предполагая, что SQL на самом деле возвращает строки (не числа или даты), вы можете просто привести к строке, например: (string)reader["username"].
Если SQL возвращает не строковые типы данных, вы можете вызвать Convert.ToString(reader["username"]).

Оба из них приведут к null, если MySQL вернет null.

Если вы хотите, чтобы MySQL null s приводил к чему-то отличному от null, используйте оператор объединения нулей, например: Convert.ToString(reader["username"]) ?? "It's Null!".

1 голос
/ 13 января 2010

Например, давайте представим, что ваше «first_name» равно нулю в базе данных; reader["first_name"] вернет null, и у него нет метода .ToString(), поэтому ваш код завершится ошибкой.

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

txtFirstname.Text = reader["first_name"  ] as string ?? "";
txtLastname.Text  = reader["last_name"   ] as string ?? "";
imgUser.File      = path + reader["photo"] as string ?? "";
expDate           = reader["expiration_datetime"] as string ?? "";
usrName           = reader["username"] as string ?? "";

НТН

0 голосов
/ 13 января 2010

так что я думаю, это поможет опубликовать весь код, вот он.Я просто пытаюсь активировать учетную запись в ldap, сканируя штрих-код, который напечатан на карте.я также получаю информацию о пользователе этой учетной записи, из базы данных MySQL.



using System;
using System.Collections;
using Gtk;
using MySql.Data.MySqlClient;
using Novell.Directory.Ldap;</p>

<p>public partial class MainWindow: Gtk.Window
{<br>
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();
    }</p>

<code>protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
    Application.Quit ();
    a.RetVal = true;
}

protected virtual void OnEntry1FocusOutEvent (object o, Gtk.FocusOutEventArgs args)
{
    string conString = "server=localhost;database=ldap;User ID=someid;password=somepassword;";
    string sql = String.Format("Select * From user where barcode='{0}'",txtBarcode.Text);
    string path = "/home/path/to/project/Photo/";
    string expDate = "";
    string usrName = "";
    //creating connection with database
    MySqlConnection dbcon;
    dbcon = new MySqlConnection(conString);
    try

    {

        dbcon.Open();

    }

    catch (Exception ex)

    {
        Console.WriteLine(ex.ToString());

        //Console.WriteLine("MySQL Database Connection Problem !!!");

    }
    //reading data from mysql
    MySqlCommand dbcmd = new MySqlCommand(sql, dbcon);

    MySqlDataReader reader = dbcmd.ExecuteReader();

    while(reader.Read()){


        txtFirstname.Text = Convert.ToString(reader["first_name"]);
        txtLastname.Text  = Convert.ToString(reader["last_name"]);
        imgUser.File      = path+Convert.ToString(reader["photo"]);
        expDate           = Convert.ToString(reader["expiration_datetime"]);
        usrName           = Convert.ToString(reader["username"]);

        }

    dbcon.Close();

    //changeing time from sting to datetime
    DateTime dt = Convert.ToDateTime(expDate);
    DateTime now = DateTime.Now;
    txtStatus.Text = dt.ToString();
    //checking if the account has expired
    if(dt > now){
        //connecting with ldap server
        string server = "ip of the server";
        string dn = "cn=Manager,dc=itc";
        string up = "password";
        string dn1 = "uid="+usrName+",ou=people,dc=itc";

        // Create a new LdapConnection instance
        LdapConnection connl = new LdapConnection();

        // Connect to the server
        connl.Connect(server, 389);

        //Bind
        connl.Bind(dn,up);

        //Modify user in ldap entry
        ArrayList modList = new ArrayList();
        LdapAttribute attribute;
        //Replace the value of loginshell attribute
        attribute = new LdapAttribute( "loginShell", "/bin/sh");
        modList.Add( new LdapModification(LdapModification.REPLACE, attribute));

        LdapModification[] mods = new LdapModification[modList.Count];  
        //Type mtype=Type.GetType("Novell.Directory.LdapModification");
        mods = (LdapModification[])modList.ToArray(typeof(LdapModification));

        //Modify the entry in the directory
        connl.Modify ( dn1, mods );
        txtStatus.Text="Account Activated!";
        // Disconnect from server
        connl.Disconnect();
    }else{
        txtStatus.Text="Account Expired!";

    }
}

}

0 голосов
/ 13 января 2010

Судя по исключению в вашем комментарии, похоже, что у вас есть совершенно другая проблема где-то еще.

Я предполагаю, что вы читаете файл .resources и генерируете имя файла из запроса SQL. Если это так, null s может привести к созданию неправильного имени файла.

Вам нужно отладить ваш код.

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