7

あるテーブルからデータをプルし(MS Access)、それを別のテーブルに挿入する(さらにデータを追加する)FormViewがあります。日付に問題があります。

最初のテーブルには、との2つの日付フィールドがdate_submittedありdate_updatedます。一部のレコードでdate_updatedは、空白です。これにより、2番目のテーブルに挿入しようとすると、データの不一致エラーが発生します。

これはdate_updated、最初のテーブルのフィールドをFormViewのHiddenFieldにデータバインディングしていることが原因である可能性があります。次に、HiddenFieldから値を取得し、それを2番目のテーブルに挿入しようとします。

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

そこに値がある場合は機能しますが、Accessの日付/時刻フィールドに何も挿入できないようです。date_updated(に値がない場合に使用するために)に挿入しない2番目の挿入ステートメントを作成できると思いますがdate_updated、それが唯一の方法ですか?より簡単で冗長性の少ない方法があるはずです。

編集

わかった。そこで、SqlDateTime.Null、Nothing、およびDBNull.Valueを挿入してみました。SqlDateTime.Nullの結果、値1/1/1900がデータベースに挿入されます。「Nothing」により、2001年1月1日が挿入されます。また、DBNull.Valueを使用しようとすると、文字列に変換できないことが示されるため、その場で何かをしなかった可能性があります。とにかく、Accessのフィールドに何も挿入しないと空白のままになることを期待していましたが、何かで埋める必要があるようです...

編集

DBNull.Valueを機能させましたが、完全に空白の値が挿入されます。これが私の最終的な作業コードです。

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

みんな、ありがとう!

4

3 に答える 3

3

サラ、更新する前に日付/時刻をキャストしてみましたか?データの不一致エラーはhfDateRequestUpdated.Value、データベースに挿入しようとしているものが列タイプと一致しないことが原因である可能性があります。

コードをステップスルーして、その値のタイプを確認してみてください。それが文字列であることがわかった場合(フォームのフィールドからのものであるため、そう思われる可能性があります)、最初にそのフィールドが空の文字列(VBNullString)であるかどうかを確認する必要があります。その場合は、データベースに挿入する値をに変更する必要がDBNullあります。これは、を使用してVB.Netで取得できますDBNull.Value

コードが表示されないため、データベースに値を取得する方法は正確にはわかりませんが、次のようになります。

If theDateValueBeingInserted is Nothing Then
    theDateValueBeingInserted = DBNull.Value
EndIf

上記のテストは、HiddenFieldから取得した値が文字列である場合にのみ機能することに注意してください。これは、ドキュメントによると私は信じています。それはおそらくあなたが抱えているこのすべての問題が原因であるところです。日付/時刻の値を文字列に暗黙的に変換していますが(これは簡単です)、特に初期値がDBNull


マーシャルが提案しようとしていたのは上記のコードと同等だったと思いますが、VB.Netでは次のように見える「三項演算子」と呼ばれるショートカット式で:

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

ただし、新しいプログラマーには混乱を招き、2008年に構文がから変更されたため、お勧めしません。IFF(condition ? trueResult : falseResult)

于 2012-05-03T15:24:24.570 に答える
2

あなたのコード

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

いくつかの問題があります:

  1. であると宣言myDateRequestUpdatedする場合DateTime、DbNull.Valueをその中に入れることはできません。
  2. for DbNull.Valueが必要かどうか()はわかりません。これはプロパティであり、メソッドではありません(確かに言うのに十分なVBがわかりません)
  3. :VBはそのオペレーターを知りません

おそらく必要なのは、Nullable(Of DateTime)欠落している可能性のあるDateTime値を格納することです。

次に、次のようなものを使用して値を保存します。

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

hfDateRequestUpdated.Value空の場合はNothing、結果として使用します。それ以外の場合は、値を日付として解析します(有効な日付でない場合は失敗する可能性があります!)。

于 2012-05-03T15:26:10.643 に答える
2

これを試して:

  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
于 2013-12-05T10:15:22.587 に答える