Sql 使用VisualStudio/TableAdapter在.NET中创建存储过程Insert语句时出现问题

Sql 使用VisualStudio/TableAdapter在.NET中创建存储过程Insert语句时出现问题,sql,.net,visual-studio,sql-insert,tableadapter,Sql,.net,Visual Studio,Sql Insert,Tableadapter,我正在尝试为我的持久层的类型化数据集创建一个TableAdapter。我将从文件中读取信息,然后将其插入数据库 文件中的信息是序列号、级别、日期、时间和准确性 我需要插入的信息是监视器ID、VOC级别、日期、时间和准确性 SerialNumber与数据库中的MonitorID相关。我试图在Visual Studio中的TableAdapterConfig向导中编写的插入是: INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accur

我正在尝试为我的持久层的类型化数据集创建一个
TableAdapter
。我将从文件中读取信息,然后将其插入数据库

  • 文件中的信息是序列号、级别、日期、时间和准确性
  • 我需要插入的信息是监视器ID、VOC级别、日期、时间和准确性
SerialNumber
与数据库中的
MonitorID
相关。我试图在Visual Studio中的
TableAdapter
Config向导中编写的插入是:

INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accuracy)
VALUES( (SELECT MonitorID FROM Monitor WHERE SerialNumber= @SerialNumber), @Level, @Date, @Time, @Accuracy)
我得到的错误是

必须声明标量变量“@SerialNumber”


我怎样才能避开这件事
SerialNumber
Monitor
表中,但是我需要插入的表是
VOCReading

insert
命令有两种风格:

(1)或者您有所有可用的值,作为文本或SQL Server变量-在这种情况下,您可以使用
插入。。VALUES()
方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView
INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accuracy)
    SELECT MonitorID, @Level, @Date, @Time, @Accuracy
    FROM Monitor 
    WHERE SerialNumber = @SerialNumber
注意:我建议始终明确指定要插入数据的列的列表-这样,如果突然您的表有一个额外的列,或者如果您的表有一个
标识
或计算列,您将不会有任何令人不快的意外。是的-这是一个稍微多一点的工作-一次-但是你有了你的
INSERT
语句,它尽可能的坚固,如果你的表改变了,你就不必一直摆弄它了

(2)如果没有将所有值作为文本和/或变量,而是希望依赖另一个表、多个表或视图来提供值,则可以使用
插入。。。选择…
进近:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView
INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accuracy)
    SELECT MonitorID, @Level, @Date, @Time, @Accuracy
    FROM Monitor 
    WHERE SerialNumber = @SerialNumber
在这里,您必须在
SELECT
中定义与
INSERT
所需数量相同的项目,这些项目可以是表(或视图)中的列,也可以是文字或变量。再次:明确提供要插入的列的列表-请参见上文

可以使用<强>一个或另一个<强> -但是你<强>不能< /强>混合两个-你不能使用<代码>值(…)<代码>,然后在你的值列表中间有一个<代码>选择< /代码>查询-选择其中的一个-坚持它。< /P> 因此,在您的情况下,您必须使用

INSERT。。选择
方法,因为您需要从表格中选择一些内容-您不能使用值方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView
INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accuracy)
    SELECT MonitorID, @Level, @Date, @Time, @Accuracy
    FROM Monitor 
    WHERE SerialNumber = @SerialNumber

您的命令参数列表中是否有
@SerialNumber
?还有,你的插入查询是错误的。是啊,我几次不小心输入了SensorName而不是SerialNumber,但这已经被修复了。SerialNumber不是我试图插入的表中的一列。序列号来自Arduino。但是,每个SerialNumber都直接映射到一个MonitorID,它是Monitor表的主键!