Apabila cuba mencari pangkalan data SQL melalui C# berdasarkan mana-mana kriteria carian yang dimasukkan, saya mendapat ralat bahawa rentetan input tidak dalam format yang betul
P粉327903045
P粉327903045 2024-03-20 00:15:39
0
1
466

Saya cuba mencari pangkalan data saya menggunakan prosedur tersimpan melalui program saya. Matlamatnya adalah untuk mencari menggunakan mana-mana tiga kriteria yang dimasukkan. ID#, nama pertama dan/atau nama keluarga. Saya mencipta prosedur tersimpan berikut dalam MySql:

CREATE DEFINER=`mainuser`@`localhost` PROCEDURE `searchvisitor`(
    enteredid int,
    enteredfn varchar(25),
    enteredln varchar(25)
)
begin
    select visitors.visitorid, visitors.firstname, visitors.lastname, visitors.middleinitial from visitors where visitors.visitorid = enteredid or visitors.firstname like '%enteredfn%' or visitors.lastname like '%enteredln%';
end

Kod C# saya adalah seperti berikut:

Pertanyaan pangkalan data:

public DataView searchUserQuery(int id, string fn, string ln)
    {
        using (MySqlConnection conn = new MySqlConnection(Helper.connVal("ntpantry")))
        {
            conn.Open();
            DataTable dt = new DataTable();
            string lgquery = "searchvisitor";
            MySqlCommand cmd = new MySqlCommand(lgquery, conn);
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("enteredid", id);
            cmd.Parameters.AddWithValue("enteredfn", fn);
            cmd.Parameters.AddWithValue("enteredln", ln);
            MySqlDataReader dr = cmd.ExecuteReader();
            dt.Load(dr);
            DataView dv = new DataView(dt);
            return dv;
        }
    }

Pertanyaan jambatan (cuba edit atau alih keluar logik tambahan di satu tempat):

public DataView Searchvisitor()
    {
        if (GetVisitor.VisitorFirstName.Length == 0)
        {
            GetVisitor.VisitorFirstName = " ";
        }
        if (GetVisitor.VisitorLastName.Length == 0)
        {
            GetVisitor.VisitorLastName = " ";
        }
        return dq.searchUserQuery(Convert.ToInt32(GetVisitor.VisitorID), GetVisitor.VisitorFirstName, GetVisitor.VisitorLastName);
    }

Panggil selepas mengklik butang carian:

private void button2_Click(object sender, EventArgs e)
    {
        //Add get set to put logic in bridge data instead
        GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text);
        GetVisitor.VisitorFirstName = textBox_searchfn.Text;
        GetVisitor.VisitorLastName = textBox_searchln.Text;
        data_searchresults.DataSource = bd.Searchvisitor();
        
        
        DataGridViewColumn columnid = data_searchresults.Columns[0];
        columnid.Width = 40;
        DataGridViewColumn columnfn = data_searchresults.Columns[1];
        columnfn.Width = 60;
        DataGridViewColumn columnln = data_searchresults.Columns[2];
        columnln.Width = 60;

        //was currently working on fixing search results. works for id but not first name or last name. Also results box only shows 2 items
    }

Jika perlu, berikut adalah ciri-ciri yang saya gunakan:

public class GetVisitor
{
    public static int VisitorID { get; set; }
    public static string VisitorFirstName { get; set;}
    public static string VisitorLastName { get; set;}
}

Ia berfungsi hebat apabila mencari ID! Tetapi jika saya cuba mencari hanya nama pertama dan/atau nama keluarga saya mendapat ralat berikut:

System.FormatException: 'Input string was not in a correct format.'

Fikiran saya ialah nama itu kosong menyebabkan ia mempunyai isu pemformatan dalam ruang putih, jadi saya cuba memasukkan ruang untuk menambah beberapa kandungan tetapi ia tidak berjaya. Adakah ia akan kembali kepada cara prosedur tersimpan saya disediakan atau dalam kod C#? Saya mencuba untuk seketika tetapi menghadapi masalah.

Terima kasih terlebih dahulu!

P粉327903045
P粉327903045

membalas semua(1)
P粉530519234

Hampir pasti terdapat banyak maklumat yang tidak berkaitan dalam soalan ini. Ini hampir pasti tiada kaitan dengan pangkalan data atau pertanyaan atau apa-apa selain daripada menukar string kepada nombor. Anda tidak memberitahu kami di mana pengecualian itu dilemparkan, tetapi saya rasa ia ada di sini:

GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text);

jika TextBox 不包含 32 位整数的有效表示,则该代码将失败并显示该错误消息。显而易见的解决方案是在将用户输入转换为数字之前验证用户输入。毕竟它是一个 TextBox, jadi pengguna boleh memasukkan apa sahaja.

Saya mengesyorkan anda menguji terlebih dahulu jika pengguna telah memasukkan apa-apa. Jika mereka tidak, maka anda boleh menganggap mereka tidak cuba mencari menggunakan ID dan bertindak sewajarnya. Bagaimana anda melakukan ini terpulang kepada anda, tetapi saya akan melakukannya dengan cara yang berbeza. Tetapi ini adalah di luar skop soalan ini. Jika mereka memasukkan sesuatu maka anda harus menyemak sama ada ia adalah nombor yang sah dan berhenti jika tidak. Hanya dalam kes ini anda perlu meneruskan. Kaedah TryParse sebarang jenis angka (dan beberapa yang lain) boleh disahkan dan ditukar dalam satu langkah, mis

if (textBox_searchid.TextLength == 0)
{
    // No ID entered
}
else if (int.TryParse(textBox_searchid.Text, out var id))
{
    // Use id here
}
else
{
    // Invalid ID entered
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan