2015-06-09 82 views
-4

下面我有一段代碼應該寫出來自我的數據庫的列,但是當我嘗試執行時,它給了我一個例外,說它無法讀取沒有列的列值,但它的錯誤,因爲它應該包含我希望信息出來的列中的日期。從SQL Server將信息寫入C#

下面是表的定義:

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME   TABLE_TYPE 
PATRICK_DEV dbo   FILE_DATE_PROCESSED BASE TABLE 

下面是代碼:

try 
{ 
    SqlConnection connect = new SqlConnection("Server=OMADB01;Database=PATRICK_DEV;Trusted_Connection=True;"); 
    connect.Open(); 

    SqlCommand command = new SqlCommand("INSERT FILE_DATE_PROCESSED(UID, FILE_DATE_PROCESSED, FILE_NAME, DATE_ENTERED) SELECT newid(), '2015-12-31 19:32:45', 'myfilename.txt', getdate()", connect); 

    SqlDataReader reader = null; 
    reader = command.ExecuteReader(); 

    while (reader.Read()) 
    { 
     Console.WriteLine(reader["FILE_DATE_PROCESSED"].ToString()); 
     Console.WriteLine(reader["DATE_ENTERED"].ToString()); 
    } 

    connect.Close(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.ToString()); 
} 

這是我處理的,現在什麼:我在SQL數據庫中,看起來像這樣:

UID FILE_DATE_PROCESSED FILE_NAME DATE_ENTERED 

在這個數據庫中,每次我添加一個文件時,第2列應該包含上次輸入的內容編輯文件,第4列應包含我現在輸入文件的時間。這就是我要尋找的結果:

UID  FILE_DATE_PROCESSED FILE_NAME  DATE_ENTERED 
random random date   the file name the current date 
number 

如果沒有解決這個問題比我已經發布了,請讓我知道,我會非常感激的方式不同。

+6

您正在執行INSERT操作,沒有任何可讀的信息 – Steve

+0

要獲取表定義,請使用'SELECT * FROM information_schema.tables',並且應該爲您提供表的列表。如果你需要一個完整的獨立查詢來獲取表定義,請參考http://stackoverflow.com/questions/6215459/t-sql-query-to-show-table-definition –

+0

@Steve後面有一個select語句插入語句。很難看,因爲如果你不滾動它被切斷。 – Mark

回答

0

您的查詢執行的INSERT(IE將數據添加到您的表)不retrive任何記錄。 T-SQL could use a SELECT subquery中的INSERT語句用於提供INSERT後列出的列請求的值。

因此,您的查詢在每次運行時都會添加一條新記錄,但沒有從該查詢返回的列,並且在不存在的列上使用reader索引器會產生上述錯誤。

如果你只是想讀值,那麼你應該查詢更改爲

try 
{ 
    using(SqlConnection connect = new SqlConnection(....)) 
    using(SqlCommand command = new SqlCommand(
     @"SELECT FILE_DATE_PROCESSED, DATE_ENTERED FROM FILE_DATE_PROCESSED", connect)) 
    { 
     connect.Open(); 
     using(SqlDataReader reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       Console.WriteLine(reader["FILE_DATE_PROCESSED"].ToString()); 
       Console.WriteLine(reader["DATE_ENTERED"].ToString()); 
      } 
     } 
    } 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.ToString()); 
} 

我建議也改變FILE_DATE_PROCESSED列名或表名,因爲具有相同名稱的兩個對象可能是一個無止境的混淆的原因和出色的錯誤製造商

+0

它說這不是一個正確的語法。然後,當我擺脫它時,它更多地對我大喊 – user4970927

+0

SELECT查詢的基本語法是'SELECT <字段名,用逗號分隔> FROM

'。所以如果你遇到語法錯誤,我認爲你的名字有問題。嘗試在字段名稱'[FILE_DATE_PROCESSED]'和同一個表格中放置方括號。同時我想做一個小測試 – Steve

+0

不,使用列名與表的確切名稱沒有問題,只是混淆。請發佈確切的錯誤,並重新檢查您的代碼是否有錯誤拼寫或其他微妙的錯字 – Steve

0

您沒有選擇語句。更改添加與名的select語句可能會幫助:

 @cmdText = @"DECLARE @FILE_DATE_PROCESSED DATETIME = '2015-12-31 19:32:45', 
      @DATE_ENTERED DATETIME =getdate() 
    INSERT FILE_DATE_PROCESSED(UID, FILE_DATE_PROCESSED, FILE_NAME, DATE_ENTERED) 
    SELECT newid(), @FILE_DATE_PROCESSED, 'myfilename.txt',@DATE_ENTERED 
    SELECT @FILE_DATE_PROCESSED AS FILE_DATE_PROCESSED, @DATE_ENTERED as DATE_ENTERED" 
SqlCommand command = new SqlCommand(@cmdText) 
+0

謝謝。問題是,我不認爲AS是正確的語法。我說因爲運行代碼我得到一個異常,說關鍵字'AS'附近的語法錯誤 – user4970927

+0

嗯,我在SSMS工作。 AS應該是可選的 - 嘗試刪除 – Mark

+0

對不起,我誤解了你原來的SQL。我已經用可能更好的東西更新了我的答案 – Mark