Dapper从查询返回特定字段

时间:2018-08-20 12:22:55

标签: dapper

我正在努力连接到SQL数据库,并在C#应用程序中设置变量以匹配Dapper查询返回的值。

我能够返回正确的行信息(我使用了datagridview来显示我获得了正确的行,并且当我调试时看到了正确的数据),但是如何将程序变量设置为仅其中一列?这是一些显示我的流程的代码

连接并运行存储过程:

            using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MfgDataCollector"].ToString()))
        {
            DynamicParameters param = new DynamicParameters();
            param.Add("@UserID", txt_userid.Text.Trim());

            List<User> userinfo = conn.Query<User>("GetUserInfo", param, commandType: CommandType.StoredProcedure).ToList<User>();

            Variables.UserID = txt_userid.Text.Trim();

            datagridview1.DataSource = userinfo; //this displays the right information, however I want to store the information as a public variable(like above)
            Variables.Userfull = userinfo; //when debugging this shows I have the right information but its all columns of user

用户类别:

class User
{
    public string UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int AccessLevel { get; set; }
    public int FirstUse { get; set; }
    public string Password { get; set; }
    public int LoginCounter { get; set; }
    public string LastLogin { get; set; }
    public string FirstLogin { get; set; }
    public string UserFullName { get; set; }
}

编辑

每个答案,我尝试使用以下代码将命令切换为executescalar:

var userinfo = conn.ExecuteScalar<User>("GetUserInfo", param, commandType: CommandType.StoredProcedure);

这让我可以设置

Variables.UserID = userinfo.UserID;

没有红花线行,但是在运行时我在执行标量“ System.InvalidCastException:'从'System.String'到'Name_Space.User'的强制转换。'

我已经检查了用户类以确保数据类型与数据库匹配,并且在那里我看不到任何问题,我不确定自己做错了什么吗?

1 个答案:

答案 0 :(得分:0)

如果只想从一行的一列中获取值,请使用ExecuteScalar,它类似于ADO.NET ExecuteScalar。它将返回object,您需要进一步处理。

string sql = "SELECT COL1 FROM Table1 WHERE ID = 1";
//OR
//string sql = "SELECT TOP 1 COL1 FROM Table1";
//OR similar
object colValue = conn.ExecuteScalar(sql, ....);

如果找不到匹配的记录,则返回值为null

查看Dapper文档中方法的其他常规变体:

public static T ExecuteScalar<T>(this IDbConnection cnn, CommandDefinition command);

如果您希望多行中的一列,那么现在的做法是正确的。只需修改您的SQL查询/存储过程以返回相同的值即可。 Dapper将仅映射返回的列。 User中的所有其他属性将保持未分配状态。


如果您只是想为Variables.UserID分配值,而不是使用DataSource绑定值,则可以这样做:

Variables.UserID = userinfo.UserID;
Variables.Userfull = userinfo.UserFullName;
//and so on....

因此,完整的代码如下:

using(SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MfgDataCollector"].ToString()))
{
    DynamicParameters param = new DynamicParameters();
    param.Add("@UserID", txt_userid.Text.Trim());

    User userinfo = conn.Query<User>("GetUserInfo", param, commandType: CommandType.StoredProcedure).ToList<User>().First();

    Variables.UserID = userinfo.UserID;
    Variables.Userfull = userinfo.UserFullName;
}