1

我需要将校准同时存储到两个表中,其中一个表描述校准实例(操作员、日期、站点),另一个表将原始数据存储在多行中(9 或 10 对波长和响应度用于单次校准)。其架构如下:

光谱仪校准方案

校准示例:

光谱仪校准数据

SpectrometerCalibration.ID = 所有校准点的 SpectrometerCalibrationID。我尝试过的(在 vb.net 中实际使用 LINQ to SQL,所以将其视为伪代码)

INSERT INTO SpectrometerCalibration (StationID, OperatorID, Date) VALUES (7, 2, '2013/10/21 11:00:00.000 AM')

SELECT TOP 1 ID FROM SpectrometerCalibration ORDER BY ID DESC

-- Insert once for each wavelength / responsivity pair
INSERT INTO SpectrometerCalibrationValues (SpectrometerCalibrationID, Wavelength, Responsivity) VALUES (<from previous query>, <wl>, <val>)

此解决方案存在时间问题。如果两个站点同时校准,可能会返回不正确的 ID。我认为这是糟糕的设计。试图避免这种方法。

我在 SO 上看到了许多更复杂的问题,但似乎没有一个能解决我的问题。我认为有一个标准的方法可以正确地做到这一点。不,我无法更改此架构。我在 vb.net 中使用 LINQ to SQL。有更好的方法吗?

4

3 回答 3

2

在 SQL Server 中,它看起来像这样:

DECLARE @NewID int

INSERT INTO SpectrometerCalibration (StationID, OperatorID, Date)
VALUES (7, 2, '2013/10/21 11:00:00.000 AM')

SELECT @NewID = SCOPE_IDENTITY()

-- Insert once for each wavelength / responsivity pair
INSERT INTO SpectrometerCalibrationValues (SpectrometerCalibrationID, Wavelength, Responsivity)
VALUES (@NewID , <wl>, <val>)

要在 LINQ2SQL 中获得相同的结果,您可以使用以下命令:

using (var dbc = new yourDataContext())
{
    var calibration = new SpectrometerCalibration
        {
            StationID = 7,
            OperatorID = 2,
            Date = dateTime.Now
        };
    dbc.calibrations.InsertOnSubmit(calibration );
    dbc.SubmitChanges();

    var clibrationValue = new SpectrometerCalibrationValue
          {
              SpectrometerCalibrationID = calibration.Id,
              Wavelength = 1,
              Responsivity = 1
          };
    dbc.clibrationValues.InsertOnSubmit(clibrationValue);
    dbc.SubmitChanges();
}
于 2013-10-21T16:05:16.337 回答
0

Linq-to-Sql(你提到你正在使用)是最好的方法之一。

您只需要创建对象:

SpectrometerCalibration calibration = new SpectrometerCalibration();
yourDataContext.SpectrometerCalibrations.InsertOnSubmit(calibration);
yourDataContext.SubmitChanges();
// After the line above Linq-to-Sql retrieves the id of the calibration object.

// Then, you could make your values:
SpectrometerCalibrationValue value = new SpectrometerCalibrationValue();
value.SpectrometerCalibrationID = calibration.Id;
// Don't forget to update the calibration data in the value objects.
yourDataContext.SpectrometerCalibrationValues.InsertOnSubmit(value);
yourDataContext.SpectrometerCalibrationValues.InsertOnSubmit(value2);
// Etc ...

yourDataContext.SubmitChanges();

但是,我强烈建议您更改架构以将外键放在另一个表上。

于 2013-10-21T16:16:12.483 回答
0

在这种情况下,我的偏好是使用存储过程,这样数据库层就可以更好地控制实际发生的事情,并且它允许在将信息返回到应用程序层之前对信息执行更复杂的逻辑.

在这种情况下,假设 Date 不是表上自然键的一部分,T-SQL 逻辑将被塑造成如下所示。

INSERT INTO SpectrometerCalibration (StationID, OperatorID, Date)
SELECT 
FROM (SELECT @StationID [StationID], @OperatorID [OperatorID], @Date [DateStamp]) T
LEFT JOIN SpectrometerCalibration C ON
    C.StationID = T.StationID
    AND C.OperatorID = T.OperatorID
WHERE C.ID IS NULL

SELECT @SpectrometerCalibrationID = ID
FROM SpectrometerCalibration 
WHERE StationID = @StationID
    AND OperatorID = @OperatorID
    --Not known if Date is part of combination which uniquely identifies a row
    --AND Date = @Date

INSERT INTO SpectrometerCalibrationValues (SpectrometerCalibrationID, Wavelength, Responsivity)
VALUES (@SpectrometerCalibrationID, <S
于 2013-10-21T16:17:45.993 回答