none
具有函數給值的欄項的新增問題 RRS feed

  • 問題

  • 大大MVP您好

    這問題不好描述,大意上是,我設計的Table有十個欄位,其中有一個index,Primary Key,自動給號,還有其中一個,CreatedDate,採用函數getdate()給值。

    程式端,我用TableAdapter設計,製作相關的dataset.xsd,執行期間我安排了一段程式碼,經過一段邏輯運算後,要連續新增數筆資料,我先定義了一個該TableRow的區域變數,用TableAdapter去NewRow(),然後在此變數下的欄位屬性設定所要的值,所有資料列處理完後,最後,就是要異動到資料庫,我執行了Update(_myRow)的批次更新方法。

    問題來了,index欄位的值,我要怎麼給?CreatedDate的值要怎麼給?因為,index欄位的值,我怎麼給都會發生Run-Time Error,因為該值是在資料庫階段才會指派。

    麻煩囉

    2007年1月29日 下午 01:39

解答

  • Dear Marson,

    根據您的問題,我用 VS 2005 寫了一段 Code 測試 (但不確定與您的程式碼相同),是可以正常作業的。

    1. Table Schema

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ADO_ISSUE]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ADO_ISSUE]
    GO

    CREATE TABLE [dbo].[ADO_ISSUE] (
     [Identies] [int] IDENTITY (1, 1) NOT NULL ,
     [EMP_ID] [char] (6) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
     [EMP_NAME] [char] (20) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
     [CREATE_DATE] [datetime] Default getdate() Not NULL
    ) ON [PRIMARY]
    GO

    2. Code:

       Private Sub Add_DataRow()

            Dim cn As New SqlClient.SqlConnection
            Dim da As SqlClient.SqlDataAdapter
            Dim dt As New Data.DataTable
            Dim dtRow As Data.DataRow

            cn.ConnectionString = "Server=rayyenxpp;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=Test"
            cn.Open()

            da = New SqlClient.SqlDataAdapter("Select EMP_ID,EMP_NAME,CREATE_DATE from ADO_ISSUE", cn)
            da.Fill(dt)


            dtRow = dt.NewRow()
            dtRow("EMP_ID") = "000001"
            dtRow("EMP_NAME") = "Bill Gates"
            dt.Rows.Add(dtRow)

            Dim builder As SqlCommandBuilder = New SqlCommandBuilder(da)
            da.Update(dt)

            'Me.DataGridView1.DataSource = dt
            'Me.DataBind()

            cn.Close()
            cn = Nothing
        End Sub

    3. 結果:

    Identies,EMP_ID,EMP_NAME,CREATE_DATE
    1,000001,Bill Gates          ,2007-03-09 19:02:48.850
    2,000001,Bill Gates          ,2007-03-09 19:02:49.880
    3,000001,Bill Gates          ,2007-03-09 19:02:50.630
    4,000001,Bill Gates          ,2007-03-09 19:02:51.147
    5,000001,Bill Gates          ,2007-03-09 19:02:51.600
    6,000001,Bill Gates          ,2007-03-09 19:02:52.567
    7,000001,Bill Gates          ,2007-03-09 19:02:53.770

     

    Thanks! Have a nice weekend!

     

    Ray Yen

    微軟技術支援處

     

    2007年3月21日 上午 06:06

所有回覆

  • 這兩各欄位值不需要給

    請你檢查TableAdapter内的insert部份產生的sql語法

    將這兩各欄位及欄位值去掉應該就可順利新增

    原因正如您說的 這兩個欄位是由資料庫給值

    並非由程式來給

    2007年1月29日 下午 02:47
  • 謝謝您的回應

    確實,我沒指定任何值給這兩個欄位,才會覺得奇怪。

    Insert的部分本來也就沒有指定這兩個欄位

    我翻了相關介紹TableAdapter的Batch Update的說明,似乎是說在執行Update(row as TableRow)之後,裡面會判斷哪些資料需要新增、修改、刪除,會自動產生對應的SQL,是這樣嗎?還是會引用到我在Insert Property中對應的Stored Procedure?

    謝謝

    2007年1月29日 下午 03:55
  • 的確沒錯您在執行Update(row as TableRow)之後,

    裡面會判斷哪些資料需要新增、修改、刪除,

    再利用tableadapter所提供的insert update delete方法

    來處理資料

    所以請您檢查tableadapter自己產生的insert update delete方法

    內的sql語法是否多傳了那兩個參數

    2007年1月29日 下午 04:07
  • 謝謝您這麼快速的回應

    您提到TableAdapter會自行產生對應的insert update delete方法,那不就是我無法控制囉?

    我檢查過我的SQL確實沒有那兩個參數呢

     

    再次謝謝

    2007年1月29日 下午 04:11
  • 您只要重新設定你的tableadapter內

    insert update delete 內sql指令碼就可以了

     

    2007年1月29日 下午 04:15
  • 謝謝再次的回應

    想請問一下,我在TableAdapter裡面設定的insert update delete 是Stored Procedure,你是要我改stored procedure嗎?這些stored procedure都沒你說的那些問題,似乎不需要改,想請問您,我需要改哪些地方呢?

    謝謝這麼晚了還打擾

    2007年1月29日 下午 04:27
  • Dear Marson,

    根據您的問題,我用 VS 2005 寫了一段 Code 測試 (但不確定與您的程式碼相同),是可以正常作業的。

    1. Table Schema

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ADO_ISSUE]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ADO_ISSUE]
    GO

    CREATE TABLE [dbo].[ADO_ISSUE] (
     [Identies] [int] IDENTITY (1, 1) NOT NULL ,
     [EMP_ID] [char] (6) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
     [EMP_NAME] [char] (20) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
     [CREATE_DATE] [datetime] Default getdate() Not NULL
    ) ON [PRIMARY]
    GO

    2. Code:

       Private Sub Add_DataRow()

            Dim cn As New SqlClient.SqlConnection
            Dim da As SqlClient.SqlDataAdapter
            Dim dt As New Data.DataTable
            Dim dtRow As Data.DataRow

            cn.ConnectionString = "Server=rayyenxpp;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=Test"
            cn.Open()

            da = New SqlClient.SqlDataAdapter("Select EMP_ID,EMP_NAME,CREATE_DATE from ADO_ISSUE", cn)
            da.Fill(dt)


            dtRow = dt.NewRow()
            dtRow("EMP_ID") = "000001"
            dtRow("EMP_NAME") = "Bill Gates"
            dt.Rows.Add(dtRow)

            Dim builder As SqlCommandBuilder = New SqlCommandBuilder(da)
            da.Update(dt)

            'Me.DataGridView1.DataSource = dt
            'Me.DataBind()

            cn.Close()
            cn = Nothing
        End Sub

    3. 結果:

    Identies,EMP_ID,EMP_NAME,CREATE_DATE
    1,000001,Bill Gates          ,2007-03-09 19:02:48.850
    2,000001,Bill Gates          ,2007-03-09 19:02:49.880
    3,000001,Bill Gates          ,2007-03-09 19:02:50.630
    4,000001,Bill Gates          ,2007-03-09 19:02:51.147
    5,000001,Bill Gates          ,2007-03-09 19:02:51.600
    6,000001,Bill Gates          ,2007-03-09 19:02:52.567
    7,000001,Bill Gates          ,2007-03-09 19:02:53.770

     

    Thanks! Have a nice weekend!

     

    Ray Yen

    微軟技術支援處

     

     

    2007年3月9日 上午 11:06
  • Dear Marson,

    根據您的問題,我用 VS 2005 寫了一段 Code 測試 (但不確定與您的程式碼相同),是可以正常作業的。

    1. Table Schema

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ADO_ISSUE]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ADO_ISSUE]
    GO

    CREATE TABLE [dbo].[ADO_ISSUE] (
     [Identies] [int] IDENTITY (1, 1) NOT NULL ,
     [EMP_ID] [char] (6) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
     [EMP_NAME] [char] (20) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
     [CREATE_DATE] [datetime] Default getdate() Not NULL
    ) ON [PRIMARY]
    GO

    2. Code:

       Private Sub Add_DataRow()

            Dim cn As New SqlClient.SqlConnection
            Dim da As SqlClient.SqlDataAdapter
            Dim dt As New Data.DataTable
            Dim dtRow As Data.DataRow

            cn.ConnectionString = "Server=rayyenxpp;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=Test"
            cn.Open()

            da = New SqlClient.SqlDataAdapter("Select EMP_ID,EMP_NAME,CREATE_DATE from ADO_ISSUE", cn)
            da.Fill(dt)


            dtRow = dt.NewRow()
            dtRow("EMP_ID") = "000001"
            dtRow("EMP_NAME") = "Bill Gates"
            dt.Rows.Add(dtRow)

            Dim builder As SqlCommandBuilder = New SqlCommandBuilder(da)
            da.Update(dt)

            'Me.DataGridView1.DataSource = dt
            'Me.DataBind()

            cn.Close()
            cn = Nothing
        End Sub

    3. 結果:

    Identies,EMP_ID,EMP_NAME,CREATE_DATE
    1,000001,Bill Gates          ,2007-03-09 19:02:48.850
    2,000001,Bill Gates          ,2007-03-09 19:02:49.880
    3,000001,Bill Gates          ,2007-03-09 19:02:50.630
    4,000001,Bill Gates          ,2007-03-09 19:02:51.147
    5,000001,Bill Gates          ,2007-03-09 19:02:51.600
    6,000001,Bill Gates          ,2007-03-09 19:02:52.567
    7,000001,Bill Gates          ,2007-03-09 19:02:53.770

     

    Thanks! Have a nice weekend!

     

    Ray Yen

    微軟技術支援處

     

    2007年3月21日 上午 06:06