如何通过存储过程调用和获取数据?

时间:2018-03-02 08:05:28

标签: c# stored-procedures

请告诉我如何从商店程序中拨打电话并获取数据?

private void GetPatient(string sPatient)
    {
        string connString = "Server = XXX.X.X.XXX; Database = XXX; UID = XXXX; Password = XXXX";
        MySqlConnection conn = new MySqlConnection(connString);
        MySqlCommand cmd;
        MySqlDataAdapter da;
        DataTable dt = new DataTable();
        cmd = new MySqlCommand("getPerson_Search", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@sPatient", sPatient);
        cmd.Parameters.Add("@tFullName", MySqlDbType.VarChar, 64);
        cmd.Parameters["@tFullName"].Direction = ParameterDirection.Output;
        cmd.Parameters.Add("@tHN", MySqlDbType.VarChar, 9);
        cmd.Parameters["@tHN"].Direction = ParameterDirection.Output;
        cmd.Parameters.Add("@tCid", MySqlDbType.VarChar, 13);
        cmd.Parameters["@tCid"].Direction = ParameterDirection.Output;
        da = new MySqlDataAdapter(cmd);
        try
        {
            conn.Open();
            da.Fill(dt);
            dataGridView1.DataSource = dt;
            dataGridView1.DataBinding();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "ข้อผิดพลาด");

        }
        finally
        {
            conn.Close();
        }
        return "OK.";
    }

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

从广义上讲,你是在正确的路线上。有一些构建错误会阻止您,例如尝试从需要修复的string方法返回void,但这与问题无关。你有大多数ADO.NET的东西OK-ish。有一些“尼特”,比如在一次性物品周围使用usingconncmd等)。

请注意,@tFullName似乎没有填充SQL,因此我怀疑该参数是否会按预期运行。看起来您正在考虑将视为 out parameters ,在这种情况下:您根本不需要这些参数。列通过数据读取器返回(在这种情况下)数据适配器正在使用。坦率地说,我会在大多数情况下使用DataTable提倡反对(主要的例外是像临时报告查询那样无法合理地知道模式) - 而是转移到{{1模型(或类似)。像“小巧玲珑”这样的工具会对此有所帮助,使您的代码类似于:

List<SomeType>

(其中using(var conn = new MySqlConnection(connString)) { var people = conn.Query<Person>("getPerson_Search", new { sPatient }, commandType: CommandType.StoredProcedure).AsList(); peopleGrid.DataSource = people; } 具有与来自查询的列匹配的属性)