1

在我的 SQL 数据库中,我对美国的每个州都有一个表。用户可以创建多个不同状态的页面。每个表都有一个“UserID”列,该列将始终与登录用户匹配。如何在多个表中搜索“UserID”?

string sqlquery = "SELECT * FROM[all tables] WHERE @UserID ='" + userID.Text + "'";

SqlConnection conn1 = new SqlConnection(connString);
SqlCommand comm1 = new SqlCommand(sqlquery, conn1);
SqlDataReader DR1 = comm1.ExecuteReader();
if (DR1.Read())
{
Textbox1.Text = DR1.GetValue(0).ToString();
}
4

3 回答 3

8

我还没有看到您的数据库架构,但我已经可以告诉您需要重构它。没有必要为每个状态都有一张表,而且维护起来可能很粗糙。您应该拥有一个包含所有状态的表,然后是另一个引用 State 表的表,该表包含您想要的任何信息(您的“页面”)

CREATE TABLE States
(
    StateID int not null, --PK
    StateName nvarchar(32) not null
)

CREATE TABLE Pages
(
    PagesID int not null, --PK
    StateID int not null, --FK
    UserID int not null
    //Whatever other columns you need
)

现在,您可以Pages根据特定PageStateUser

SELECT * FROM Pages WHERE UserID = (userId)
SELECT * FROM Pages WHERE StateID IN (1, 5, 20)
SELECT * FROM Pages WHERE PageID = (pageID)
于 2013-01-31T23:21:27.487 回答
1

正确的答案是您需要更改您的数据库,以便所有这些信息都保存在一个表中。简单的答案是花几分钟时间创建一个将所有表联合在一起的视图,以便您可以访问它们,就好像它们都在一个表中一样。

我的回答与其他人的唯一区别是我不会在你的 c# 代码中联合它们。我只是在将它们结合在一起的数据库上创建一个实际视图。视图会很简单(虽然很长),您的代码也会很简单。

于 2013-01-31T23:26:31.593 回答
0

如果表具有相同的列,我会选择类似的东西。使用 sql UNION

var statesTables = new[]{"NY, Texas, Oregano, Alabama}";

var qBuild = new StringBuilder();

qBuild.Append(string.Format("SELECT * FROM {0} WHERE UserId = @userId ", statesTables[0]));

for(int i=1;i<stateTables.Length;i++){
     qbuild.Append(string.Format("UNION SELECT * FROM {0} WHERE UserId = @userId ", statesTables[i]))
}

SqlConnection conn1 = new SqlConnection(connString);
SqlCommand comm1 = new SqlCommand(qBuild.ToString(), conn1);
comm1.Parameters.Add(new SqlParameter("userId", userId));

它将生成 SQL:

SELECT * FROM NY WHERE UserId = @userId
UNION 
SELECT * FROM Texas WHERE UserId = @userId
UNION 
SELECT * FROM Oregano WHERE UserId = @userId
UNION 
SELECT * FROM Alabama WHERE UserId = @userId

如果有一些不同的列,请将 * 替换为表共有的列名。

但是,正如其他人所建议的那样,重构您的数据库模式将是最好的!

于 2013-01-31T23:19:19.457 回答