我正在编写我的第一个C#应用程序,在这种情况下只是一个“学习练习”这个例子是我在VB.Net中多次使用的简化代码块,所以我知道它可以正常工作。这就是VB代码的样子。
Public Class User
Private Const CN_LoginId As String = "Login"
Private Const CN_Password As String = "Password"
Private _password As String
Public Property Password() As String
Get
Return _password
End Get
Set(ByVal value As String)
_password = value
End Set
End Property
Public Shared Function Create(ByVal Login As String) As User
Dim usr = New User()
Using dt As DataTable = DAC.ExecuteDataTable("usp_PasswordSelect", _
DAC.Parameter(CN_LoginId, Login))
With dt.Rows(0)
usr.Password = CStr(.Item(CN_Password))
End With
End Using
Return usr
End Function
End Class
所以在C#中我试过手工转换它并使用Telerik的在线转换实用程序,这就是我在下面发布的内容,因为我假设它更接近正确答案然后我自己做了什么。
public class User
{
private const string CN_LoginId = "Login";
private const string CN_Password = "Password";
private string _password;
public string Password
{
get { return _password; }
set { _password = value; }
}
public static User Create(string Login)
{
object usr = new User();
using (DataTable dt = DAC.ExecuteDataTable("usp_PasswordSelect",
DAC.Parameter(CN_LoginId, Login)))
{
{
usr.Password = Convert.ToString(dt.Rows(0).Item(CN_Password));
}
}
return usr;
}
}
我得到的第一个错误就是这行usr.Password = Convert.ToString(dt.Rows(0).Item(CN_Password));.错误是“错误1'对象'不包含'密码'的定义,并且没有扩展方法'密码'接受类型'对象'的第一个参数可以找到(您是否缺少using指令或程序集引用?)
此时我假设第二个错误将在我修复第一个错误时消失。所以我的问题是如何使用C#中的DataTable正确设置此Object的属性?
答案 0 :(得分:1)
您需要声明用户的类型(在您的代码中,用户是一个在运行时是USer的对象,但不是在编译时)。您可以执行以下操作:
var user = new User();
或
User user = new User();
除了评论。 正如Jonathan Dickinson正确地说的那样,
user.Password = dt.Rows[0]["Password"];
应该这样做,因为这是一个索引器。
答案 1 :(得分:1)
以下是我写的方式:
public class User
{
private const string CN_LoginId = "Login";
private const string CN_Password = "Password";
public string Password { get; set; }
public static User Create(string Login)
{
User usr = new User();
using (DataTable dt = DAC.ExecuteDataTable("usp_PasswordSelect",
DAC.Parameter(CN_LoginId, Login)))
{
usr.Password = Convert.ToString(dt.Rows[0][CN_Password]);
}
return usr;
}
}
一些注意事项:
Rows(0)
不正确 - 应为Rows[0]
。User
对象声明为User
,而不是object
。您将失去对其属性的所有可见性。您也可以使用var
,但如果您正在学习C#,那么最好明确声明您的变量类型。它可以进行重复声明(例如User u = new User()
),但至少你会清楚地看到变量的类型。Item
访问数组项...只需将其作为您正在使用的行元素中的元素。这就是为什么我有dt.Rows[0][CN_Password]
的双数组。同样,C#使用方括号,而不是用于访问数组元素的parens。_password
字段,并使用Password
的自动属性。我没有看到你的代码中使用了_password
,并认为它会让事情变得混乱。自动属性具有由编译器自动创建的后备字段,因此您不必跟踪变量和属性。如果你使用了很多属性,这可以节省大量时间。