2

在我的 C# Web 应用程序中,我有一个简单的页面,用户在一个文本框中输入他们的名字(命名txtFirst),在另一个文本框中输入他们的姓(命名txtLast)。在两个文本框中输入此信息后,他们单击继续按钮,将数据保存到 SQL 数据库。我的问题是尝试将这些值保存在 SQL 中。我有一个“值”表(列是PersonIDAttributeIDValue)和一个“属性”表(列是主键AttributeIDAttributeName)。

在我的属性表中,我有以下内容:

AttributeID:   AttributeName: 
    1            FirstName 
    2            LastName

我的目标是将此保存在 Value 表中:

PersonID:       AttributeID:             Value: 
    A                1                     FirstName Value Here
    B                2                     LastName Value Here

我知道如何通过将数据直接传递到存储过程来保存数据,但是如何正确分配 AttributeID?(例如:AttributeID = 1forFirstNameAttributeID = 2for LastName)。有没有办法可以将应用程序中的文本框分配给特定的AttributeID甚至是AttributeName?非常感谢。

这可能会令人困惑,但这里的想法是当单击按钮时,它会从表中提取与 FirstName 关联的 AttributeID,然后将值保存在表“Value”中。谢谢

4

2 回答 2

1

将每个的 AttributeID 放入每个相应文本框的 Tag 属性中。这是一个黑客,但它会完成工作。但是,当您检索它时,您需要将存储在标签中的值转换为正确的类型:

A. 设置 .Tag 属性:

txtFirst.Tag = firstNameAttributeID;
txtLast.Tag = lastNameAttributeID;

B. 检索 .Tag 属性(例如,假设两者都是整数):

firstNameAttributeID = (int)txtFirst.Tag;
lastNameAttributeID = (int)txtLast.Tag;

就像我说的,你也许可以完成这项工作。但我可能会先检查你的设计。在我看来,您的个人实体应该为这些事情中的每一个指定字段。

于 2013-01-07T23:35:49.813 回答
0

我会将它们存储在ViewStateSession取决于您在做什么:

//Code to get the values from the database.
Session("FirstNamePersionId") = fnamePId;
Session("FirstNameAttributeId") = fnameAId;
Session("LastNamePersionId") = lnamePId;
Session("LastNamePersionId") = lnameAId;
//other code.

然后访问只是使用Session("FirstNamePersionId")或你所称的值。

我会将对属性ViewStateSession属性的调用包装起来,以使其更易于维护和阅读。

如果你需要一个例子,请告诉我。

更新
要从数据库中获取值,您可以尝试以下操作。

int fNameId = -1, lNameId = -1;
SqlConnection sqlConn = new SqlConnection(conString);//conString is the connection string for your DB.  This should be the same as what you use to execute the stored procedure.
SqlCommand sqlQuery = new SqlCommand("SELECT AttributeID, AttributeName FROM Attribute WHERE AttributeName IN ('FirstName','LastName')", sqlConn);
SqlDataReader sqlReader;

sqlConn.Open();
sqlReader = sqlQuery.ExecuteReader();
if (sqlReader.HasRows)
{
    while (sqlReader.Read())
    {
        if (sqlReader[1].ToString().Equals("FirstName", StringComparison.CurrentCultureIgnoreCase))
        {
            fNameId = (int)fNameId;
        }
        else if (sqlReader[1].ToString().Equals("LastName", StringComparison.CurrentCultureIgnoreCase))
        {
            lNameId = (int)fNameId;
        }
    }
}
sqlReader.Close();
sqlConn.Close();

如果您愿意,您可以为每个 id 单独调用,但这会增加一些处理开销。如果您确实拨打了两次电话,那么我建议您使用相同的电话SqlConnection,尽管您需要创建一个新命令。有时不赞成
通过 id 访问结果(就像我使用 id 所做的那样)。sqlReader[1]我个人并不担心,因为我在 SQL 查询中声明了列顺序。
使用 LINQ2SQL 可能会更容易。
如果我犯了任何错误或遗漏了什么,请告诉我。

于 2013-01-07T23:58:32.460 回答