none
dateTime的秒出不來 RRS feed

  • 問題

  • 我要新增一筆資料到資料庫去,採用TableAdapter.Update的方式,如下:       

    Dim nrAs DataRow = rdt.NewRow

    .....

    nr.Item("uTime") = Now

    rdt.Rows.Add(nr)

    rta.Update(rdt)

    我中斷點看,無論Now 或nr都還有秒,不過一到資料庫秒都變成00

    資料庫 uTime 欄位為 DateTime

    DataTable 的 uTime 欄位為 System.DateTime

    是否我有設定到其他東西,請大大們協助指教



    2011年7月7日 上午 07:10

解答

  • SmallDateTime精確度的確只到分,你把uTime的資料型態由SmallDateTime改成DateTime後,DataSet Designer可能因為某些原因沒有幫你把SqlParameter的資料型態改為DateTime,雖然我自己實驗後不會有這種情況,不過您倒是可以檢查一下你的TableAdapter的原始碼看看。

    PS:請看參數名稱為c2的SqlParameter。

    修改前:

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitAdapter() {
    this._adapter = new global::System.Data.SqlClient.SqlDataAdapter();
    global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();
    tableMapping.SourceTable = "Table";
    tableMapping.DataSetTable = "t3";
    tableMapping.ColumnMappings.Add("c1", "c1");
    tableMapping.ColumnMappings.Add("c2", "c2");
    this._adapter.TableMappings.Add(tableMapping);
    this._adapter.DeleteCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.DeleteCommand.Connection = this.Connection;
    this._adapter.DeleteCommand.CommandText = "DELETE FROM [t3] WHERE (([c1] = @Original_c1) AND ([c2] = @Original_c2))";
    this._adapter.DeleteCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::System.Data.SqlDbType.SmallDateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.InsertCommand.Connection = this.Connection;
    this._adapter.InsertCommand.CommandText = "INSERT INTO [t3] ([c1], [c2]) VALUES (@c1, @c2);\r\nSELECT c1, c2 FROM t3 WHERE (c1" + " = @c1)";
    this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global::System.Data.SqlDbType.SmallDateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.UpdateCommand.Connection = this.Connection;
    this._adapter.UpdateCommand.CommandText = "UPDATE [t3] SET [c1] = @c1, [c2] = @c2 WHERE (([c1] = @Original_c1) AND ([c2] = @" +	"Original_c2));\r\nSELECT c1, c2 FROM t3 WHERE (c1 = @c1)";
    this._adapter.UpdateCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global:<strong><span style="text-decoration:underline">:System.Data.SqlDbType.SmallDateTime</span></strong>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::<strong><span style="text-decoration:underline">System.Data.SqlDbType.SmallDateTime</span></strong>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    }
    


    修改後:

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitAdapter() {
    this._adapter = new global::System.Data.SqlClient.SqlDataAdapter();
    global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();
    tableMapping.SourceTable = "Table";
    tableMapping.DataSetTable = "t3";
    tableMapping.ColumnMappings.Add("c1", "c1");
    tableMapping.ColumnMappings.Add("c2", "c2");
    this._adapter.TableMappings.Add(tableMapping);
    this._adapter.DeleteCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.DeleteCommand.Connection = this.Connection;
    this._adapter.DeleteCommand.CommandText = "DELETE FROM [t3] WHERE (([c1] = @Original_c1) AND ([c2] = @Original_c2))";
    this._adapter.DeleteCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::System.Data.SqlDbType.DateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.InsertCommand.Connection = this.Connection;
    this._adapter.InsertCommand.CommandText = "INSERT INTO [t3] ([c1], [c2]) VALUES (@c1, @c2);\r\nSELECT c1, c2 FROM t3 WHERE (c1" +
    	" = @c1)";
    this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global::System.Data.SqlDbType.DateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.UpdateCommand.Connection = this.Connection;
    this._adapter.UpdateCommand.CommandText = "UPDATE [t3] SET [c1] = @c1, [c2] = @c2 WHERE (([c1] = @Original_c1) AND ([c2] = @" +
    	"Original_c2));\r\nSELECT c1, c2 FROM t3 WHERE (c1 = @c1)";
    this._adapter.UpdateCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global::<span style="text-decoration:underline"><strong>System.Data.SqlDbType.DateTime</strong></span>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::<strong><span style="text-decoration:underline">System.Data.SqlDbType.DateTime</span></strong>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    }
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月8日 上午 01:31

所有回覆

  • HI:

    請檢查您的前端程式新增資料時,是不是只有指定"年/月/日"

     


    Shadow與愉快的程式碼伙伴
    自High文不定期更新XD
    2011年7月7日 上午 07:25
  • Hi:

    要不要試試這樣?

    方案1. nr.Item("uTime") = Now.ToString("yyyy/MM/dd HH:mm:ss")

    方案2.新增資料時,採用SqlParameters的方式新增,並指定型別
    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

    方案3.用SQL字串新增資料

    例如:

    Protected Function ExecuteNonQuery(ByVal sql As String) As Integer

            Dim conn As New System.Data.SqlClient.SqlConnection("DB連線字串")
            Dim cmd As New System.Data.SqlClient.SqlCommand(sql, conn)

            conn.Open()
            Dim obj = cmd.ExecuteNonQuery()
            conn.Close()
            Return CType(obj, Integer)
        End Function

    呼叫時:

    ExecuteNonQuery("Insert into YourTable (ColumnName1) Values (getDate())")


    Shadow與愉快的程式碼伙伴
    自High文不定期更新XD



    2011年7月7日 上午 07:27
  • 謝謝大大回答,(1)(3)我試過了,還是不行。後來我將Table重建,DataTable也重拉。 可能我少描述,問題發生源由,一開始我設定uTime為SmallDateTime,後來發現SmallDateTime精確度只到分,我就將其改成DateTime,但是程式跑起來還是沒有秒。
    2011年7月8日 上午 12:43
  • To 小見光二:

    聽您講第三個方案不行,還讓我滿驚訝的

    我指的是純手寫ADO.net語法,不是靠精靈控制項拖拉^_^"

    另外,可以請您提供一下開發環境是WinForm?WPF?還是ASP.net?

    您的DB該資料表的欄位,型別應該確定過是datetime或SQL2008的datetime2,還是您的DB使用的是Access?

    而且只有4行程式碼,也很難看出個端倪(所以小弟才會提供多個方案)

    以上能否再提供詳細一點的資訊?

    方便彼此瞭解狀況,謝謝^_^



    Shadow與愉快的程式碼伙伴
    自High文不定期更新XD
    2011年7月8日 上午 01:28
  • SmallDateTime精確度的確只到分,你把uTime的資料型態由SmallDateTime改成DateTime後,DataSet Designer可能因為某些原因沒有幫你把SqlParameter的資料型態改為DateTime,雖然我自己實驗後不會有這種情況,不過您倒是可以檢查一下你的TableAdapter的原始碼看看。

    PS:請看參數名稱為c2的SqlParameter。

    修改前:

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitAdapter() {
    this._adapter = new global::System.Data.SqlClient.SqlDataAdapter();
    global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();
    tableMapping.SourceTable = "Table";
    tableMapping.DataSetTable = "t3";
    tableMapping.ColumnMappings.Add("c1", "c1");
    tableMapping.ColumnMappings.Add("c2", "c2");
    this._adapter.TableMappings.Add(tableMapping);
    this._adapter.DeleteCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.DeleteCommand.Connection = this.Connection;
    this._adapter.DeleteCommand.CommandText = "DELETE FROM [t3] WHERE (([c1] = @Original_c1) AND ([c2] = @Original_c2))";
    this._adapter.DeleteCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::System.Data.SqlDbType.SmallDateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.InsertCommand.Connection = this.Connection;
    this._adapter.InsertCommand.CommandText = "INSERT INTO [t3] ([c1], [c2]) VALUES (@c1, @c2);\r\nSELECT c1, c2 FROM t3 WHERE (c1" + " = @c1)";
    this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global::System.Data.SqlDbType.SmallDateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.UpdateCommand.Connection = this.Connection;
    this._adapter.UpdateCommand.CommandText = "UPDATE [t3] SET [c1] = @c1, [c2] = @c2 WHERE (([c1] = @Original_c1) AND ([c2] = @" +	"Original_c2));\r\nSELECT c1, c2 FROM t3 WHERE (c1 = @c1)";
    this._adapter.UpdateCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global:<strong><span style="text-decoration:underline">:System.Data.SqlDbType.SmallDateTime</span></strong>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::<strong><span style="text-decoration:underline">System.Data.SqlDbType.SmallDateTime</span></strong>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    }
    


    修改後:

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
    private void InitAdapter() {
    this._adapter = new global::System.Data.SqlClient.SqlDataAdapter();
    global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();
    tableMapping.SourceTable = "Table";
    tableMapping.DataSetTable = "t3";
    tableMapping.ColumnMappings.Add("c1", "c1");
    tableMapping.ColumnMappings.Add("c2", "c2");
    this._adapter.TableMappings.Add(tableMapping);
    this._adapter.DeleteCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.DeleteCommand.Connection = this.Connection;
    this._adapter.DeleteCommand.CommandText = "DELETE FROM [t3] WHERE (([c1] = @Original_c1) AND ([c2] = @Original_c2))";
    this._adapter.DeleteCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::System.Data.SqlDbType.DateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.InsertCommand.Connection = this.Connection;
    this._adapter.InsertCommand.CommandText = "INSERT INTO [t3] ([c1], [c2]) VALUES (@c1, @c2);\r\nSELECT c1, c2 FROM t3 WHERE (c1" +
    	" = @c1)";
    this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global::System.Data.SqlDbType.DateTime, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand = new global::System.Data.SqlClient.SqlCommand();
    this._adapter.UpdateCommand.Connection = this.Connection;
    this._adapter.UpdateCommand.CommandText = "UPDATE [t3] SET [c1] = @c1, [c2] = @c2 WHERE (([c1] = @Original_c1) AND ([c2] = @" +
    	"Original_c2));\r\nSELECT c1, c2 FROM t3 WHERE (c1 = @c1)";
    this._adapter.UpdateCommand.CommandType = global::System.Data.CommandType.Text;
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@c2", global::<span style="text-decoration:underline"><strong>System.Data.SqlDbType.DateTime</strong></span>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c1", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c1", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_c2", global::<strong><span style="text-decoration:underline">System.Data.SqlDbType.DateTime</span></strong>, 0, global::System.Data.ParameterDirection.Input, 0, 0, "c2", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
    }
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年7月8日 上午 01:31
  • To shadow:

    抱歉沒有把開發環境描述清楚,我是在開發ASP.Net,搭配SQL 2005。我第三個測試是直接將Param指定now,沒注意到妳最後面一行是要我測試直接下SQL語法與GETDATE。但我用參數指定的方式是不行,沒有測過你提供的方式。後來就如同我描述的重拉DataTable就可以跑了。最後還是謝謝妳的回答。

    2011年7月8日 下午 12:59