|
分類:[.NET 全般]
Mr.Tです、こんにちは。
Microsoft SQL Server Management Studio Express 9.00.3042.00
Microsoft .NET Framework 2.0.50727.42
Microsoft Visual Basic 2005 76541-000-0000011-00124
本来は、ASP.NETでのWebアプリケーション開発中にアレと思ったのですが、
Vb.NETでサンプル確認しても同じ現象だったので、.NET全般で質問させていただきます。
下記のサンプルを実行すると、SQLParameterを利用した場合と、SQLを直接渡した場合
とで挙動がことなってしまう件についてです。
Imports System.Data.SqlClient
Imports System.Data.SqlDbType
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strSQL As String = "insert into TestTable values(@TestID,@TestName)"
Dim TestIDPara As SqlParameter = New SqlParameter
Dim TestNamePara As SqlParameter = New SqlParameter
With TestIDPara
.ParameterName = "@TestID"
.SqlDbType = VarChar
.Size = 5
.Value = "12345678"
.Direction = ParameterDirection.Input
End With
With TestNamePara
.ParameterName = "@TestName"
.SqlDbType = VarChar
.Size = 10
.Value = "1234567890"
.Direction = ParameterDirection.Input
End With
'事前確認
MessageBox.Show(TestIDPara.Value.ToString)
Using con As SqlConnection = _
New SqlConnection("Data Source=****;Initial Catalog=****;Persist Security Info=True;User ID=**;Password=***")
Using sqlcom As SqlCommand = New SqlCommand(strSQL, con)
con.Open()
sqlcom.CommandType = CommandType.Text
sqlcom.Parameters.Add(TestIDPara)
sqlcom.Parameters.Add(TestNamePara)
Dim retVal As Integer = sqlcom.ExecuteNonQuery()
MessageBox.Show(retVal.ToString)
con.Close()
End Using
Using sqlcom1 As SqlCommand = New SqlCommand("Insert into TestTable values('987654321','1234567890')", con)
con.Open()
sqlcom1.CommandType = CommandType.Text
Dim retVal As Integer = sqlcom1.ExecuteNonQuery()
MessageBox.Show(retVal.ToString)
con.Close()
End Using
End Using
End Sub
End Class
対象となるTestTableは次のようになります。
CREATE TABLE [dbo].[TestTable](
[TestID] [varchar](5) NOT NULL,
[TestName] [varchar](10) NOT NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[TestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
SQLParameterを利用した場合、例外やエラーが発生しません。
しかし、次のSQL発行処理は、予想通り(フィールドサイズよりも大きいサイズのパラメータですので)
例外が発生して処理されません。
なんで?と発行前にTestIDPara.Valueを確認しましたが、この時点では与えたパラメータが
そのまま表示されます。
SQLCommand.Prepare()(http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.prepare(vs.80).aspx)
を行うと、パラメータで指定した場合には切り詰められることがあるようですが、
今回は実際利用してません。
SQLParameterを利用した場合でフィールドサイズより大きいかどうか、というのは
事前にチェックするロジックはもちろん組み込みますが、実行したらいきなりデータが
切り捨てられるのもちょっと乱暴な感じがします。
その他情報をあさってみましたが、上記に当てはまるものはちょっと見受けられませんでした。
SQLParameterを利用した場合ではなぜ、こういう挙動なのか、どなたかわかりますでしょうか?
#それとも、私が知らないだけで当然な現象なのでしょうか。
|