2014-03-12 60 views
1

我正在嘗試爲持久層的類型化數據集創建TableAdapter。我將從文件中讀取信息,然後將其插入數據庫中。無法創建存儲過程在.NET中使用VisualStudio/TableAdapter插入語句

  • 該文件中的信息是SerialNumber,VOCLevel,Date,Time,Accuracy。
  • 我需要插入的信息是MonitorID,VOCLevel,Date,Time,Accuracy。

SerialNumber與數據庫中的MonitorID相關。我想在TableAdapter配置嚮導在Visual Studio編寫的插件爲:

INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accuracy) 
VALUES((SELECT MonitorID FROM Monitor WHERE SerialNumber= @SerialNumber), @Level, @Date, @Time, @Accuracy) 

我得到的錯誤是

必須聲明標量變量 '@SerialNumber'

我怎樣才能解決這個問題? SerialNumberMonitor表中,但我需要插入的表爲VOCReading

+0

對你的命令,你'@ SerialNumber'參數列表?此外,您的插入查詢是錯誤的。 –

+0

Yah,我無意中幾次輸入了SensorName而不是SerialNumber,但這已經修復了。 SerialNumber不是我嘗試插入的表中的一列。 SerialNumber來自Arduino。但是,每個SerialNumber直接映射到MonitorID,這是Monitor Table的主鍵。 –

回答

1

INSERT命令有兩種形式:

(1)要麼你有你的所有值,文字或SQL Server變量 - 在這種情況下,你可以使用INSERT .. VALUES()方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN) 
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN) 

注:我會推薦給總是明確地指定字段列表中插入數據 - 這樣,你不會有任何惱人的意外,如果突然你的表有一個額外的列,或者如果你的表有一個或者計算列。是的 - 這是一個更多的工作 - 一次 - 但你的INSERT聲明儘可能堅實,如果你的表更改,你將不必一直襬弄它。

(2)如果把所有的值作爲文本和/或變量,而是要依靠另一個表,多個表或視圖,爲客戶提供價值,那麼你可以使用INSERT ... SELECT ...方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN) 
    SELECT 
     SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN 
    FROM 
     dbo.YourProvidingTableOrView 

在這裏,你必須定義在SELECT一樣多的項目,如您INSERT希望 - 那些可以從表中(S)(或視圖(S))欄,或那些可以是文字或變量。再次:明確提供要插入的列的列表 - 參見上文。

您可以使用一個或其他 - 但你不能將兩者混合 - 你不能使用VALUES(...),然後在值列表的中間SELECT查詢 - 挑兩個中的一個 - 堅持它。

你的情況

所以,你有,因爲你需要從表中選擇一些使用INSERT .. SELECT方法 - 你不能使用VALUES方法:

INSERT INTO VOCReading (MonitorID, Level, Date, Time, Accuracy) 
    SELECT MonitorID, @Level, @Date, @Time, @Accuracy 
    FROM Monitor 
    WHERE SerialNumber = @SerialNumber 
+0

你我的朋友,真棒! –

相關問題