sql DataBase中的关系

时间:2013-01-15 07:54:18

标签: sql sql-server sql-server-2008

我是新手,有一个数据库和两个表:

UsersTable contains userID(smallInt),Name,Family
ActivitiesTable contains WorkTime,RestTime,Date,userID(smallInt)

我想在一个DataGrid中获取此内容(当我添加新记录时):

userID:A WorkTime: 08:00 RestTime:14:00 Date:12.10.2012
userID:A WorkTime: 08:30 RestTime:14:00 Date:12.11.2012
userID:B WorkTime: 08:00 RestTime:15:00 Date:12.12.2012
.
.
.

如何为两个表创建关系(使用主键和外键)? 非常感谢

3 个答案:

答案 0 :(得分:1)

SELECT  name, workTime, restTime, [date]
FROM    usersTable u
JOIN    activitiesTable a
ON      a.userId = u.userId

答案 1 :(得分:1)

您可以使用

创建
CREATE TABLE UsersTable (userID smallInt NOT NULL PRIMARY KEY, 
       Name NVARCHAR(255),
       Family NVARCHAR(255))

CREATE TABLE ActivitiesTable (WorkTime DATETIME,
     RestTime DATETIME,Date DATETIME, 
     userID smallInt NOT NULL REFERENCES UsersTable (userid), 
     id int not null identity (1,1))

我已将{id}列添加到ActivitiesTable。您还应该考虑使用INT而不是smallint,因为在大多数情况下,性能和空间增益都是可以忽略的。

正如其他回答正确指出选择很简单

Select v.userID, WorkTime, RestTime, Date   
from userTable user inner join ActivitiesTable activity
on user.userid = activity.userid 

答案 2 :(得分:0)

将userID作为主键放在UsersTable中,并将其作为外键放在ActivitiesTable中(如果连接是一对一的话,最终也可以将它作为主键)。 然后使用此代码段填充DataGridView(它显示如何显示完整的数据列表)。如果你想继续使用DataBinding,我建议你不要逐个添加全新的项目,只需刷新底层的DataTable并刷新DataGridView。

基本上,优化可能是向DataTable添加新行并刷新而不从数据库中获取所有数据(因为已经拥有它,因为您只是将其插入到数据库中)。

抱歉我的英语不好。我希望我很清楚。

    try
    {
        var bindingSource1 = new BindingSource();

        // Automatically generate the DataGridView columns.
        dataGridView1.AutoGenerateColumns = true;

        // Set up the data source.
        bindingSource1.DataSource = GetData("Select * From UsersTable Inner Join ActivitiesTable"));
        dataGridView1.DataSource = bindingSource1;

        // Automatically resize the visible rows.
        dataGridView1.AutoSizeRowsMode = 
DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
    }
    catch (SqlException)
    {
        // TODO manage errors
    }
}

private static DataTable GetData(string sqlCommand)
{
    var connectionString = "%your connection string%";
    var northwindConnection = new SqlConnection(connectionString);
    var command = new SqlCommand(sqlCommand, northwindConnection);
    var adapter = new SqlDataAdapter();

    adapter.SelectCommand = command;

    var table = new DataTable();
    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
    adapter.Fill(table);

    return table;
}

P.S。如果您使用DB服务器/引擎提供程序Linq扩展,则可以使用它而不是硬编码查询(SqlCommand + string)(只需从下面的答案中获取代码)。