2012-04-20 36 views
7

Tôi có một FormView nơi tôi kéo dữ liệu từ một bảng (MS Access), và sau đó chèn nó (cộng thêm dữ liệu) vào một bảng khác. Tôi đang gặp vấn đề với ngày tháng.Chèn giá trị null vào các trường ngày?

Bảng đầu tiên có hai trường ngày: date_submitteddate_updated. Trong một số hồ sơ, date_updated để trống. Điều này khiến tôi gặp lỗi dữ liệu không khớp khi cố gắng chèn vào bảng thứ hai.

Có thể là do tôi đang kết nối dữ liệu trường date_updated từ bảng đầu tiên thành một HiddenField trên FormView. Sau đó nó có giá trị từ HiddenField và cố gắng để chèn nó vào bảng thứ hai:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated") 
myDateRequestUpdated = hfDateRequestUpdated.Value 
'... It then attempts to insert myDateRequestUpdated into the database. 

Nó hoạt động khi có một giá trị ở đó, nhưng dường như bạn không thể chèn gì vào một/lần trường ngày trong Access . Tôi cho rằng tôi có thể tạo một câu lệnh chèn thứ hai không chèn vào date_updated (để sử dụng khi không có giá trị trong date_updated), nhưng đó là cách duy nhất để làm điều đó? Có vẻ như có một cách dễ dàng hơn/ít dư thừa hơn.

EDIT:

Được rồi. Vì vậy, tôi đã thử chèn SqlDateTime.Null, Nothing, và DBNull.Value. Kết quả SqlDateTime.Null trong giá trị 1/1/1900 được chèn vào cơ sở dữ liệu. "Không có gì" khiến nó chèn vào 1/1/2001. Và nếu tôi cố gắng sử dụng DBNull.Value, nó nói với tôi rằng nó không thể được chuyển đổi thành một chuỗi, vì vậy có lẽ tôi đã không làm điều gì đó khá đúng ở đó. Dù sao đi nữa, tôi đã hy vọng rằng nếu không có gì để chèn rằng trường trong Access sẽ vẫn trống, nhưng có vẻ như nó có để điền vào nó với một cái gì đó ...

EDIT:

tôi có DBNull.Value để làm việc, và nó chèn một giá trị hoàn toàn trống. Vì vậy, đây là mã làm việc cuối cùng của tôi:

Dim hfDateRequestUpdated As HiddenField = FormView1.FindControl("hfDateRequestUpdated") 
Dim myDateRequestUpdated = Nothing 

If hfDateRequestUpdated.Value = Nothing Then 
    myDateRequestUpdated = DBNull.Value 
Else 
    myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value) 
End If 

Xin cảm ơn tất cả mọi người!

+3

Tôi không hiểu tại sao có một downvote về câu hỏi này. Tôi đã đảo ngược nó, nhưng tôi vẫn còn bối rối. – Fionnuala

+0

Tôi đồng ý, đây là một câu hỏi thú vị. Những trường ngày này luôn luôn cắn tôi. – Steve

+0

Bạn có thể thêm mẫu mã cho biết cách bạn đang chèn dữ liệu không? – phoog

Trả lời

3

Sara, bạn đã cố gắng truyền ngày/giờ trước khi cập nhật chưa? Lỗi dữ liệu không khớp có thể xuất phát từ thực tế là hfDateRequestUpdated.Value bạn đang cố gắng chèn vào cơ sở dữ liệu không khớp với loại cột.

Thử bước qua mã của bạn và xem loại giá trị đó là gì. Nếu bạn thấy rằng đó là một chuỗi (có vẻ như nó có thể, vì nó xuất phát từ một trường trên biểu mẫu), thì trước tiên bạn sẽ cần một dấu kiểm để xem trường đó có phải là chuỗi rỗng (VBNullString) hay không. Nếu vậy, bạn sẽ muốn thay đổi giá trị bạn đang chèn vào cơ sở dữ liệu thành DBNull, mà bạn có thể nhận được trong VB.Net bằng cách sử dụng DBNull.Value.

Chúng tôi không thể nhìn thấy mã của bạn, vì vậy chúng tôi không biết chính xác làm thế nào bạn có được giá trị vào cơ sở dữ liệu, nhưng nó sẽ giống như thế này

If theDateValueBeingInserted is Nothing Then 
    theDateValueBeingInserted = DBNull.Value 
EndIf 

Hãy ghi nhớ rằng các thử nghiệm trên chỉ hoạt động nếu giá trị bạn nhận được từ HiddenField là một chuỗi, mà tôi tin rằng nó là theo documentation. Đó có lẽ là nơi tất cả những rắc rối mà bạn đang gặp phải đến từ đó.Bạn đang ngầm chuyển đổi ngày giá trị của bạn/giờ để một chuỗi (đó là dễ dàng), nhưng mặc nhiên chuyển đổi chúng trở lại không phải là quá dễ dàng, đặc biệt là nếu giá trị ban đầu là một DBNull


dành

tôi nghĩ rằng những gì Marshall đã cố gắng đề nghị là tương đương với các mã trên, nhưng trong một biểu thức shortcut được gọi là 'hành ternary', trông như thế này trong VB.Net:

newValue = IF(oldValue is Nothing ? DBNull.Value : oldValue) 

tôi wou ldn't khuyên bạn nên nó mặc dù, vì nó khó hiểu để lập trình mới, và các cú pháp thay đổi trong năm 2008 từ IFF(condition ? trueResult : falseResult)

2

Mã của bạn

Dim myDateRequestUpdated As DateTime 
myDateRequestUpdated = DateTime.Parse(hfDateRequestUpdated.Value) : DBNull.Value() 

có một vài vấn đề:

  1. Khi bạn khai báo myDateRequestUpdatedDateTime, bạn không thể đặt DbNull.Value trong đó.
  2. Tôi không chắc chắn bạn cần () cho DBNull.Value: đó là một tài sản, không phải là một phương pháp (Tôi không biết đủ VB để nói chắc chắn)
  3. VB không biết rằng : hành

Điều bạn có thể muốn là Nullable(Of DateTime) để lưu trữ giá trị Ngày giờ cũng có thể bị thiếu.

Sau đó sử dụng một cái gì đó như thế này để lưu trữ các giá trị:

myDateRequestUpdated = If(String.IsNullOrWhiteSpace(hfDateRequestUpdated.Value), 
    Nothing, DateTime.Parse(hfDateRequestUpdated.Value)) 

Nếu hfDateRequestUpdated.Value là trống rỗng, sau đó sử dụng Nothing như kết quả; khác phân tích giá trị là ngày (có thể thất bại nếu nó không phải là ngày hợp lệ!).

+0

Cô ấy chỉ thử mã đó ngay từ đầu vì cô ấy đang cố làm theo các chỉ dẫn trong câu trả lời trước, được viết bằng C#. Tôi không nghĩ rằng cô ấy có bất cứ điều gì gần với điều đó trong mã gốc của cô ấy. Trong mọi trường hợp, chỉnh sửa của bạn đối với mã đã chỉnh sửa đó là âm thanh. – Alain

1

Hãy thử điều này:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Dim str As String 

    If TextBox1.Text.Length <> 0 Then 
     str = "'" & TextBox1.Text & "'" 
    Else 
     str = "NULL" 
    End If 

    sql = "insert into test(test1) values(" & str & ")" 
    dsave_sql(sql) 
End Sub 


Function save_sql(ByVal strsql As String, Optional ByVal msg As String = "Record Saved Sucessfully") As String 
    Dim sqlcon As New SqlConnection(strConn) 
    Dim comm As New SqlCommand(strsql, sqlcon) 
    Dim i As Integer 
    Try 
     sqlcon.Open() 
     i = CType(comm.ExecuteScalar(), Integer) 
     save_sql = msg 
    Catch ex As Exception 
     save_sql = ex.Message 
    End Try 
    sqlcon.Close() 
    Return i 
End Function 
Các vấn đề liên quan