我正在努力连接到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'的强制转换。'
我已经检查了用户类以确保数据类型与数据库匹配,并且在那里我看不到任何问题,我不确定自己做错了什么吗?
答案 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;
}