【问题标题】:String with commas and references table?带逗号和引用表的字符串?
【发布时间】:2016-01-04 17:10:07
【问题描述】:

我有一个我们正在维护的旧版 VB 应用程序。我们做出的设计决定是将某些数据点存储为连接字符串。由于大部分代码已完成,因此此更改是一成不变的。

我正在循环遍历一组值。我正在做的是,为参考表中的每个值查找一个标签。我需要能够在一个标签中显示值。我很难将这些值合并到一个字符串中,然后将其显示在一个标签中。这是我的代码...

If strField = "Expenditures" Then
      If InStr(1, strOldValue, ",") > 0 Then
              strArray = Split((strOldValue), ",")
                    For x = 0 To UBound(strArray)
                        For Each item In strArray
                            strMessage = DLookUp(1, "Label", "tblText_References", "ID = '" & item & "'
**''''******here I'm trying to save teh value in strMessage, however, at next item, I need it to be added to strMessage in some fashion, with a (,), I'm not sure how to do it. There are anywhere from 2 to 4 ITEMS i might have.**
                        Next item
                    Next
       End if
End if

【问题讨论】:

  • 呃。这太可怕了。不要像这样存储分隔值。它违反了 1NF 并导致无数的痛苦和痛苦。您将不得不使用动态 sql 来解决这个问题,这很可能会让您自己接受 sql 注入。您最好将每个值存储在自己的行中,然后您可以使用连接来检索用户的所有值。
  • 检查是否是第一次通过您的循环。如果不是第一次,strMessage = strMessage & "," ...
  • 另外,看起来这是 Access VBA。对吗?
  • @barry17 - 由于您提供的 sn-p 非常小,因此很难提供准确的答案。
  • 这就是所有需要的代码。我创建了一个名为 strNEWmessage 的新变量。答案是:strNewAnswer=strNewAnswer & "," strMessage.

标签: sql-server string vb6


【解决方案1】:

您绝对应该重新考虑如何存储膳食数据。切勿将多个值存储在用逗号连接的单个列中。相反,您希望创建一个包含所选项目的表,然后可以使用一对多关系将 JOINed 传递给其他表。

以下代码显示了如何完成此操作的示例。

创建一个包含Users 的表,这些Meals 将与之关联:

CREATE TABLE dbo.Users
(
    UserID INT NOT NULL
        CONSTRAINT PK_Users
        PRIMARY KEY CLUSTERED
    , UserName VARCHAR(255) NOT NULL
);

创建一个表来描述Meals

CREATE TABLE dbo.Meals
(
    MealID INT NOT NULL
        CONSTRAINT PK_Meals
        PRIMARY KEY CLUSTERED
    , MealName VARCHAR(255) NOT NULL
);

创建一个连接表,将Users 连接到它们的Meals

CREATE TABLE dbo.UserMeals
(
    UserID INT NOT NULL
    , MealID INT NOT NULL
    , CONSTRAINT PK_UserMeals
        PRIMARY KEY CLUSTERED (UserID, MealID)
);

插入一个示例用户:

INSERT INTO dbo.Users (UserID, UserName)
VALUES (1, 'Test User');

插入 4 餐:

INSERT INTO dbo.Meals (MealID, MealName)
VALUES (80, 'Breakfast')
    , (81, 'Lunch')
    , (82, 'Dinner')
    , (83, 'Snack');

UserMeals 表中插入一些示例行,将餐食与用户关联起来:

INSERT INTO dbo.UserMeals (UserID, MealID)
VALUES (1, 80)
    , (1, 81);

向用户展示他们的相关餐食:

SELECT u.UserName
    , m.MealName
FROM dbo.UserMeals um
    INNER JOIN dbo.Users u ON um.UserID = u.UserID
    INNER JOIN dbo.Meals m ON um.MealID = m.MealID;

结果:

【讨论】:

  • 这很好,非常感谢您的努力,但是,我用逗号将值存储为字符串。我已经在应用程序中的多个地方使用它们,所以现在以不同的方式存储它已经太晚了。这是我要做的最后一件事,基本上显示之前保存的值。我正在考虑制作一个值数组,并在每次保存时运行一个带有 dlookup 函数的循环,然后将其连接起来以显示在文本框中。
  • 希望您的系统永远不会有很多行,也永远不会变得很忙。如果是这样,您将因该设计决策而遭受长期和艰难的痛苦。
  • 你可能想看看Aaron Bertrand'show to split your data上的精彩文章
【解决方案2】:

这就是所有需要的代码。我创建了一个名为 strNEWmessage 的新变量作为字符串。我已经有一个名为 strMessage 作为字符串的变量答案是:strNewMessage = strNewMessage & "," strMessage

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2011-04-16
    • 2022-06-11
    • 2021-11-26
    • 2016-06-08
    • 1970-01-01
    • 2016-09-16
    • 2015-10-25
    相关资源
    最近更新 更多