Save a DWORD to SQL

J

John J. Hughes II

I need to save a DWORD to the sql server, the below posts an error, any
suggestions on what I am doing wrong. I have the column in the sql server
defined as an int since unsigned int is not valid. Also trying to avoid
setting it to a bigint in the server. Casting an int to an uint use to work
in C++.


System.Data.SqlClient.SqlConnection cn = new
System.Data.SqlClient.SqlConnection(...);
cn.Open()
System.Data.SqlClient.SqlCommand cmd = new
System.Data.SqlClient.SqlCommand();
cmd.Connection = cn;

cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
cmd.Parameters["@PS"].Value = UInt32.MaxValue;
cmd.CommandText = "UPDATE Directories SET State = @PS WHERE AreaCode = ''
AND Number = '104'";

cmd.ExecuteNonQuery(); // error here !!!!
// An unhandled exception of
type 'System.OverflowException' occurred in system.data.dll
// Additional information: Value
was either too large or too small for an Int32.


cmd.Parameters.RemoveAt("@PS");
cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode = '' AND
Number = '104'";
System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
if(dr.Read())
{
uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here if I
force the value in
}
dr.Close();
cn.Close();

This works sort of:

UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND Number =
'104'
SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
Number = '104'

So I know the SQL server is storing the data correctly, the problem is .NET
can not convert it. Also if I look at the debuging code the system shows
this on the return value:

- dr["State"] {0xffffffff} System.Int32
+ System.ValueType {System.Int32} System.ValueType
m_value 0xffffffff int
MaxValue 0x7fffffff int
MinValue 0x80000000 int


Thanks,
John
 
J

Jeffrey Tan[MSFT]

Hi John,

Just as the error message said, "Value was either too large or too small
for an Int32".
The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is 2147483647,
so the value your set is too large.
You should set a value in the range of the Int32

Hope this helps,

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| Subject: Save a DWORD to SQL
| Date: Fri, 17 Oct 2003 15:37:37 -0400
| Lines: 60
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.languages.csharp:192183
| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| I need to save a DWORD to the sql server, the below posts an error, any
| suggestions on what I am doing wrong. I have the column in the sql server
| defined as an int since unsigned int is not valid. Also trying to avoid
| setting it to a bigint in the server. Casting an int to an uint use to
work
| in C++.
|
|
| System.Data.SqlClient.SqlConnection cn = new
| System.Data.SqlClient.SqlConnection(...);
| cn.Open()
| System.Data.SqlClient.SqlCommand cmd = new
| System.Data.SqlClient.SqlCommand();
| cmd.Connection = cn;
|
| cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| cmd.CommandText = "UPDATE Directories SET State = @PS WHERE AreaCode =
''
| AND Number = '104'";
|
| cmd.ExecuteNonQuery(); // error here !!!!
| // An unhandled exception of
| type 'System.OverflowException' occurred in system.data.dll
| // Additional information:
Value
| was either too large or too small for an Int32.
|
|
| cmd.Parameters.RemoveAt("@PS");
| cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode = ''
AND
| Number = '104'";
| System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| if(dr.Read())
| {
| uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here if I
| force the value in
| }
| dr.Close();
| cn.Close();
|
| This works sort of:
|
| UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND Number =
| '104'
| SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
| Number = '104'
|
| So I know the SQL server is storing the data correctly, the problem is
.NET
| can not convert it. Also if I look at the debuging code the system shows
| this on the return value:
|
| - dr["State"] {0xffffffff} System.Int32
| + System.ValueType {System.Int32} System.ValueType
| m_value 0xffffffff int
| MaxValue 0x7fffffff int
| MinValue 0x80000000 int
|
|
| Thanks,
| John
|
|
|
 
J

John J. Hughes II

No it does not help at all! I understood the error, my question was how to
get a DWORD into SQL? SQL does not support unsigned int but this was never
a problem until I started using .NET. In the past I have just forced the
data to int and then back again. Since both an int and a unsigned int are
the same size this should not be a problem. The problem is the .NET runtime
is doing an error check on the value and will not allow me to convert it.

Regards,
John


"Jeffrey Tan[MSFT]" said:
Hi John,

Just as the error message said, "Value was either too large or too small
for an Int32".
The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is 2147483647,
so the value your set is too large.
You should set a value in the range of the Int32

Hope this helps,

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| Subject: Save a DWORD to SQL
| Date: Fri, 17 Oct 2003 15:37:37 -0400
| Lines: 60
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.languages.csharp:192183
| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| I need to save a DWORD to the sql server, the below posts an error, any
| suggestions on what I am doing wrong. I have the column in the sql server
| defined as an int since unsigned int is not valid. Also trying to avoid
| setting it to a bigint in the server. Casting an int to an uint use to
work
| in C++.
|
|
| System.Data.SqlClient.SqlConnection cn = new
| System.Data.SqlClient.SqlConnection(...);
| cn.Open()
| System.Data.SqlClient.SqlCommand cmd = new
| System.Data.SqlClient.SqlCommand();
| cmd.Connection = cn;
|
| cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| cmd.CommandText = "UPDATE Directories SET State = @PS WHERE AreaCode =
''
| AND Number = '104'";
|
| cmd.ExecuteNonQuery(); // error here !!!!
| // An unhandled exception of
| type 'System.OverflowException' occurred in system.data.dll
| // Additional information:
Value
| was either too large or too small for an Int32.
|
|
| cmd.Parameters.RemoveAt("@PS");
| cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode = ''
AND
| Number = '104'";
| System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| if(dr.Read())
| {
| uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here if I
| force the value in
| }
| dr.Close();
| cn.Close();
|
| This works sort of:
|
| UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND Number =
| '104'
| SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
| Number = '104'
|
| So I know the SQL server is storing the data correctly, the problem is
NET
| can not convert it. Also if I look at the debuging code the system shows
| this on the return value:
|
| - dr["State"] {0xffffffff} System.Int32
| + System.ValueType {System.Int32} System.ValueType
| m_value 0xffffffff int
| MaxValue 0x7fffffff int
| MinValue 0x80000000 int
|
|
| Thanks,
| John
|
|
|
 
G

Girish Bharadwaj

John said:
No it does not help at all! I understood the error, my question was how to
get a DWORD into SQL? SQL does not support unsigned int but this was never
a problem until I started using .NET. In the past I have just forced the
data to int and then back again. Since both an int and a unsigned int are
the same size this should not be a problem. The problem is the .NET runtime
is doing an error check on the value and will not allow me to convert it.

Regards,
John


Hi John,

Just as the error message said, "Value was either too large or too small
for an Int32".
The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is 2147483647,
so the value your set is too large.
You should set a value in the range of the Int32

Hope this helps,

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| Subject: Save a DWORD to SQL
| Date: Fri, 17 Oct 2003 15:37:37 -0400
| Lines: 60
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| Xref: cpmsftngxa06.phx.gbl
microsoft.public.dotnet.languages.csharp:192183

| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| I need to save a DWORD to the sql server, the below posts an error, any
| suggestions on what I am doing wrong. I have the column in the sql
server

| defined as an int since unsigned int is not valid. Also trying to avoid
| setting it to a bigint in the server. Casting an int to an uint use to
work
| in C++.
|
|
| System.Data.SqlClient.SqlConnection cn = new
| System.Data.SqlClient.SqlConnection(...);
| cn.Open()
| System.Data.SqlClient.SqlCommand cmd = new
| System.Data.SqlClient.SqlCommand();
| cmd.Connection = cn;
|
| cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| cmd.CommandText = "UPDATE Directories SET State = @PS WHERE AreaCode
=

''
| AND Number = '104'";
|
| cmd.ExecuteNonQuery(); // error here !!!!
| // An unhandled exception of
| type 'System.OverflowException' occurred in system.data.dll
| // Additional information:
Value
| was either too large or too small for an Int32.
|
|
| cmd.Parameters.RemoveAt("@PS");
| cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode = ''
AND
| Number = '104'";
| System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| if(dr.Read())
| {
| uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here if
I

| force the value in
| }
| dr.Close();
| cn.Close();
|
| This works sort of:
|
| UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND Number
=

| '104'
| SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
| Number = '104'
|
| So I know the SQL server is storing the data correctly, the problem is
NET
| can not convert it. Also if I look at the debuging code the system
shows

| this on the return value:
|
| - dr["State"] {0xffffffff} System.Int32
| + System.ValueType {System.Int32} System.ValueType
| m_value 0xffffffff int
| MaxValue 0x7fffffff int
| MinValue 0x80000000 int
|
|
| Thanks,
| John
|
|
|

Can you try either a SqlDbType.BigInt or SqlDbType.Variant?
 
J

Jeffrey Tan[MSFT]

Hi John,

Thanks for your feedback.
In C++, the code is unmanged, you can do the memory operation yourself, but
it is easy for crash and overflow.
In .Net, all codes are managed, and it will check the type, so you can not
use the Int type's sign bit as UInt's data bit.
This is the feature of .Net Framework.

I think you should use the bigint in SqlServer. As you said, you want to
avoid use bigint, what is your concern?
Does this affect your design?

Thanks

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| References: <[email protected]>
<[email protected]>
| Subject: Re: Save a DWORD to SQL
| Date: Mon, 20 Oct 2003 09:23:05 -0400
| Lines: 122
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <#[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-184-105.asm.bellsouth.net 66.20.184.105
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.languages.csharp:192591
| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| No it does not help at all! I understood the error, my question was how
to
| get a DWORD into SQL? SQL does not support unsigned int but this was
never
| a problem until I started using .NET. In the past I have just forced the
| data to int and then back again. Since both an int and a unsigned int are
| the same size this should not be a problem. The problem is the .NET
runtime
| is doing an error check on the value and will not allow me to convert it.
|
| Regards,
| John
|
|
| | >
| > Hi John,
| >
| > Just as the error message said, "Value was either too large or too small
| > for an Int32".
| > The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is
2147483647,
| > so the value your set is too large.
| > You should set a value in the range of the Int32
| >
| > Hope this helps,
| >
| > Best regards,
| > Jeffrey Tan
| > Microsoft Online Partner Support
| > Get Secure! - www.microsoft.com/security
| > This posting is provided "as is" with no warranties and confers no
rights.
| >
| > --------------------
| > | From: "John J. Hughes II" <[email protected]>
| > | Subject: Save a DWORD to SQL
| > | Date: Fri, 17 Oct 2003 15:37:37 -0400
| > | Lines: 60
| > | Organization: Function International
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| > | Message-ID: <[email protected]>
| > | Newsgroups: microsoft.public.dotnet.languages.csharp
| > | NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| > | Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| > | Xref: cpmsftngxa06.phx.gbl
| microsoft.public.dotnet.languages.csharp:192183
| > | X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
| > |
| > | I need to save a DWORD to the sql server, the below posts an error,
any
| > | suggestions on what I am doing wrong. I have the column in the sql
| server
| > | defined as an int since unsigned int is not valid. Also trying to
avoid
| > | setting it to a bigint in the server. Casting an int to an uint use
to
| > work
| > | in C++.
| > |
| > |
| > | System.Data.SqlClient.SqlConnection cn = new
| > | System.Data.SqlClient.SqlConnection(...);
| > | cn.Open()
| > | System.Data.SqlClient.SqlCommand cmd = new
| > | System.Data.SqlClient.SqlCommand();
| > | cmd.Connection = cn;
| > |
| > | cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| > | cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| > | cmd.CommandText = "UPDATE Directories SET State = @PS WHERE
AreaCode
| =
| > ''
| > | AND Number = '104'";
| > |
| > | cmd.ExecuteNonQuery(); // error here !!!!
| > | // An unhandled exception
of
| > | type 'System.OverflowException' occurred in system.data.dll
| > | // Additional information:
| > Value
| > | was either too large or too small for an Int32.
| > |
| > |
| > | cmd.Parameters.RemoveAt("@PS");
| > | cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode =
''
| > AND
| > | Number = '104'";
| > | System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| > | if(dr.Read())
| > | {
| > | uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here
if
| I
| > | force the value in
| > | }
| > | dr.Close();
| > | cn.Close();
| > |
| > | This works sort of:
| > |
| > | UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND
Number
| =
| > | '104'
| > | SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
| > | Number = '104'
| > |
| > | So I know the SQL server is storing the data correctly, the problem is
| > NET
| > | can not convert it. Also if I look at the debuging code the system
| shows
| > | this on the return value:
| > |
| > | - dr["State"] {0xffffffff} System.Int32
| > | + System.ValueType {System.Int32} System.ValueType
| > | m_value 0xffffffff int
| > | MaxValue 0x7fffffff int
| > | MinValue 0x80000000 int
| > |
| > |
| > | Thanks,
| > | John
| > |
| > |
| > |
| >
|
|
|
 
J

John J. Hughes II

Thanks of your response. I am trying to avoid big int mostly because I have
some rather large systems installed and don't want to run a convert on the
records. The second reason would have to deal with trying to avoid the
rather large system becoming even larger. int 4 bytes vis bit int 8
bytes... I have tables with more then a few so the records would almost
double in size. And lastly I receive the data as a DWORD and send it that
way which is not really a problem but it adds to the mess.

Now I had though about casting it to a big int but the value still comes in
a -1 which is not correct or useful.

I have the following code which works but as you can imagine it does add
some overhead and does not work with default .NET functions.

static public Int32 ToInt32(UInt32 v)
{
byte[] tmp = new byte[4];

tmp[0] = (byte)(v & 0x000000ff);
tmp[1] = (byte)(v & 0x0000ff00 >> 8);
tmp[2] = (byte)(v & 0x00ff0000 >> 16);
tmp[3] = (byte)(v & 0xff000000 >> 24);

return BitConverter.ToInt32(tmp, 0);
}

static public UInt32 ToUInt32(Int32 v)
{
byte[] tmp = new byte[4];

tmp[0] = (byte)(v & 0x000000ff);
tmp[1] = (byte)(v & 0x0000ff00 >> 8);
tmp[2] = (byte)(v & 0x00ff0000 >> 16);
tmp[3] = (byte)(v & 0xff000000 >> 24);

return BitConverter.ToUInt32(tmp, 0);
}


Regards,
John


"Jeffrey Tan[MSFT]" said:
Hi John,

Thanks for your feedback.
In C++, the code is unmanged, you can do the memory operation yourself, but
it is easy for crash and overflow.
In .Net, all codes are managed, and it will check the type, so you can not
use the Int type's sign bit as UInt's data bit.
This is the feature of .Net Framework.

I think you should use the bigint in SqlServer. As you said, you want to
avoid use bigint, what is your concern?
Does this affect your design?

Thanks

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| References: <[email protected]>
<[email protected]>
| Subject: Re: Save a DWORD to SQL
| Date: Mon, 20 Oct 2003 09:23:05 -0400
| Lines: 122
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <#[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-184-105.asm.bellsouth.net 66.20.184.105
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.languages.csharp:192591
| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| No it does not help at all! I understood the error, my question was how
to
| get a DWORD into SQL? SQL does not support unsigned int but this was
never
| a problem until I started using .NET. In the past I have just forced the
| data to int and then back again. Since both an int and a unsigned int are
| the same size this should not be a problem. The problem is the .NET
runtime
| is doing an error check on the value and will not allow me to convert it.
|
| Regards,
| John
|
|
| | >
| > Hi John,
| >
| > Just as the error message said, "Value was either too large or too small
| > for an Int32".
| > The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is
2147483647,
| > so the value your set is too large.
| > You should set a value in the range of the Int32
| >
| > Hope this helps,
| >
| > Best regards,
| > Jeffrey Tan
| > Microsoft Online Partner Support
| > Get Secure! - www.microsoft.com/security
| > This posting is provided "as is" with no warranties and confers no
rights.
| >
| > --------------------
| > | From: "John J. Hughes II" <[email protected]>
| > | Subject: Save a DWORD to SQL
| > | Date: Fri, 17 Oct 2003 15:37:37 -0400
| > | Lines: 60
| > | Organization: Function International
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| > | Message-ID: <[email protected]>
| > | Newsgroups: microsoft.public.dotnet.languages.csharp
| > | NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| > | Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| > | Xref: cpmsftngxa06.phx.gbl
| microsoft.public.dotnet.languages.csharp:192183
| > | X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
| > |
| > | I need to save a DWORD to the sql server, the below posts an error,
any
| > | suggestions on what I am doing wrong. I have the column in the sql
| server
| > | defined as an int since unsigned int is not valid. Also trying to
avoid
| > | setting it to a bigint in the server. Casting an int to an uint use
to
| > work
| > | in C++.
| > |
| > |
| > | System.Data.SqlClient.SqlConnection cn = new
| > | System.Data.SqlClient.SqlConnection(...);
| > | cn.Open()
| > | System.Data.SqlClient.SqlCommand cmd = new
| > | System.Data.SqlClient.SqlCommand();
| > | cmd.Connection = cn;
| > |
| > | cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| > | cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| > | cmd.CommandText = "UPDATE Directories SET State = @PS WHERE
AreaCode
| =
| > ''
| > | AND Number = '104'";
| > |
| > | cmd.ExecuteNonQuery(); // error here !!!!
| > | // An unhandled exception
of
| > | type 'System.OverflowException' occurred in system.data.dll
| > | // Additional information:
| > Value
| > | was either too large or too small for an Int32.
| > |
| > |
| > | cmd.Parameters.RemoveAt("@PS");
| > | cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode =
''
| > AND
| > | Number = '104'";
| > | System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| > | if(dr.Read())
| > | {
| > | uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here
if
| I
| > | force the value in
| > | }
| > | dr.Close();
| > | cn.Close();
| > |
| > | This works sort of:
| > |
| > | UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND
Number
| =
| > | '104'
| > | SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
| > | Number = '104'
| > |
| > | So I know the SQL server is storing the data correctly, the problem is
| > NET
| > | can not convert it. Also if I look at the debuging code the system
| shows
| > | this on the return value:
| > |
| > | - dr["State"] {0xffffffff} System.Int32
| > | + System.ValueType {System.Int32} System.ValueType
| > | m_value 0xffffffff int
| > | MaxValue 0x7fffffff int
| > | MinValue 0x80000000 int
| > |
| > |
| > | Thanks,
| > | John
| > |
| > |
| > |
| >
|
|
|
 
J

John J. Hughes II

Girish Bharadwaj said:
John said:
No it does not help at all! I understood the error, my question was how to
get a DWORD into SQL? SQL does not support unsigned int but this was never
a problem until I started using .NET. In the past I have just forced the
data to int and then back again. Since both an int and a unsigned int are
the same size this should not be a problem. The problem is the .NET runtime
is doing an error check on the value and will not allow me to convert it.

Regards,
John


Hi John,

Just as the error message said, "Value was either too large or too small
for an Int32".
The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is 2147483647,
so the value your set is too large.
You should set a value in the range of the Int32

Hope this helps,

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| Subject: Save a DWORD to SQL
| Date: Fri, 17 Oct 2003 15:37:37 -0400
| Lines: 60
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| Xref: cpmsftngxa06.phx.gbl
microsoft.public.dotnet.languages.csharp:192183

| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| I need to save a DWORD to the sql server, the below posts an error, any
| suggestions on what I am doing wrong. I have the column in the sql
server

| defined as an int since unsigned int is not valid. Also trying to avoid
| setting it to a bigint in the server. Casting an int to an uint use to
work
| in C++.
|
|
| System.Data.SqlClient.SqlConnection cn = new
| System.Data.SqlClient.SqlConnection(...);
| cn.Open()
| System.Data.SqlClient.SqlCommand cmd = new
| System.Data.SqlClient.SqlCommand();
| cmd.Connection = cn;
|
| cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| cmd.CommandText = "UPDATE Directories SET State = @PS WHERE
AreaCode

=
''
| AND Number = '104'";
|
| cmd.ExecuteNonQuery(); // error here !!!!
| // An unhandled exception of
| type 'System.OverflowException' occurred in system.data.dll
| // Additional information:
Value
| was either too large or too small for an Int32.
|
|
| cmd.Parameters.RemoveAt("@PS");
| cmd.CommandText = "SELECT State FROM Directories WHERE AreaCode = ''
AND
| Number = '104'";
| System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| if(dr.Read())
| {
| uint val = Convert.ToUInt32(dr["PhoneState"]); // same error here
if

I
| force the value in
| }
| dr.Close();
| cn.Close();
|
| This works sort of:
|
| UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND
Number

=
| '104'
| SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = '' AND
| Number = '104'
|
| So I know the SQL server is storing the data correctly, the problem is
NET
| can not convert it. Also if I look at the debuging code the system
shows

| this on the return value:
|
| - dr["State"] {0xffffffff} System.Int32
| + System.ValueType {System.Int32} System.ValueType
| m_value 0xffffffff int
| MaxValue 0x7fffffff int
| MinValue 0x80000000 int
|
|
| Thanks,
| John
|
|
|

Can you try either a SqlDbType.BigInt or SqlDbType.Variant?

I was trying not to convert existing databases or make them larger by using
big int... I might look at variant, since I have never used it before I am
not sure if it's an option.

Thanks,
John
 
J

Jeffrey Tan[MSFT]

Hi John,

I think your workaround of converting the UInt32 to Int32 programmatic is a
good solution, but it will make your application complex.
While using the bigint, you program logic is simple, but the database is
bigger.
So I think you should count the cost between these 2 ways.

Thanks for your feedback.

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

--------------------
| From: "John J. Hughes II" <[email protected]>
| References: <[email protected]>
<[email protected]>
<#[email protected]>
<#[email protected]>
| Subject: Re: Save a DWORD to SQL
| Date: Tue, 21 Oct 2003 11:54:13 -0400
| Lines: 236
| Organization: Function International
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <OWbCRu#[email protected]>
| Newsgroups: microsoft.public.dotnet.languages.csharp
| NNTP-Posting-Host: adsl-20-177-139.asm.bellsouth.net 66.20.177.139
| Path:
cpmsftngxa06.phx.gbl!cpmsftngxa10.phx.gbl!TK2MSFTNGXA05.phx.gbl!TK2MSFTNGP08
.phx.gbl!TK2MSFTNGP10.phx.gbl
| Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.languages.csharp:192911
| X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
|
| Thanks of your response. I am trying to avoid big int mostly because I
have
| some rather large systems installed and don't want to run a convert on the
| records. The second reason would have to deal with trying to avoid the
| rather large system becoming even larger. int 4 bytes vis bit int 8
| bytes... I have tables with more then a few so the records would almost
| double in size. And lastly I receive the data as a DWORD and send it that
| way which is not really a problem but it adds to the mess.
|
| Now I had though about casting it to a big int but the value still comes
in
| a -1 which is not correct or useful.
|
| I have the following code which works but as you can imagine it does add
| some overhead and does not work with default .NET functions.
|
| static public Int32 ToInt32(UInt32 v)
| {
| byte[] tmp = new byte[4];
|
| tmp[0] = (byte)(v & 0x000000ff);
| tmp[1] = (byte)(v & 0x0000ff00 >> 8);
| tmp[2] = (byte)(v & 0x00ff0000 >> 16);
| tmp[3] = (byte)(v & 0xff000000 >> 24);
|
| return BitConverter.ToInt32(tmp, 0);
| }
|
| static public UInt32 ToUInt32(Int32 v)
| {
| byte[] tmp = new byte[4];
|
| tmp[0] = (byte)(v & 0x000000ff);
| tmp[1] = (byte)(v & 0x0000ff00 >> 8);
| tmp[2] = (byte)(v & 0x00ff0000 >> 16);
| tmp[3] = (byte)(v & 0xff000000 >> 24);
|
| return BitConverter.ToUInt32(tmp, 0);
| }
|
|
| Regards,
| John
|
|
| | >
| > Hi John,
| >
| > Thanks for your feedback.
| > In C++, the code is unmanged, you can do the memory operation yourself,
| but
| > it is easy for crash and overflow.
| > In .Net, all codes are managed, and it will check the type, so you can
not
| > use the Int type's sign bit as UInt's data bit.
| > This is the feature of .Net Framework.
| >
| > I think you should use the bigint in SqlServer. As you said, you want to
| > avoid use bigint, what is your concern?
| > Does this affect your design?
| >
| > Thanks
| >
| > Best regards,
| > Jeffrey Tan
| > Microsoft Online Partner Support
| > Get Secure! - www.microsoft.com/security
| > This posting is provided "as is" with no warranties and confers no
rights.
| >
| > --------------------
| > | From: "John J. Hughes II" <[email protected]>
| > | References: <[email protected]>
| > <[email protected]>
| > | Subject: Re: Save a DWORD to SQL
| > | Date: Mon, 20 Oct 2003 09:23:05 -0400
| > | Lines: 122
| > | Organization: Function International
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| > | Message-ID: <#[email protected]>
| > | Newsgroups: microsoft.public.dotnet.languages.csharp
| > | NNTP-Posting-Host: adsl-20-184-105.asm.bellsouth.net 66.20.184.105
| > | Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
| > | Xref: cpmsftngxa06.phx.gbl
| microsoft.public.dotnet.languages.csharp:192591
| > | X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
| > |
| > | No it does not help at all! I understood the error, my question was
how
| > to
| > | get a DWORD into SQL? SQL does not support unsigned int but this was
| > never
| > | a problem until I started using .NET. In the past I have just forced
| the
| > | data to int and then back again. Since both an int and a unsigned int
| are
| > | the same size this should not be a problem. The problem is the .NET
| > runtime
| > | is doing an error check on the value and will not allow me to convert
| it.
| > |
| > | Regards,
| > | John
| > |
| > |
| > | | > | >
| > | > Hi John,
| > | >
| > | > Just as the error message said, "Value was either too large or too
| small
| > | > for an Int32".
| > | > The UInt32.MaxValue is 4294967295, while the Int32.MaxValue is
| > 2147483647,
| > | > so the value your set is too large.
| > | > You should set a value in the range of the Int32
| > | >
| > | > Hope this helps,
| > | >
| > | > Best regards,
| > | > Jeffrey Tan
| > | > Microsoft Online Partner Support
| > | > Get Secure! - www.microsoft.com/security
| > | > This posting is provided "as is" with no warranties and confers no
| > rights.
| > | >
| > | > --------------------
| > | > | From: "John J. Hughes II" <[email protected]>
| > | > | Subject: Save a DWORD to SQL
| > | > | Date: Fri, 17 Oct 2003 15:37:37 -0400
| > | > | Lines: 60
| > | > | Organization: Function International
| > | > | X-Priority: 3
| > | > | X-MSMail-Priority: Normal
| > | > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| > | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| > | > | Message-ID: <[email protected]>
| > | > | Newsgroups: microsoft.public.dotnet.languages.csharp
| > | > | NNTP-Posting-Host: adsl-20-184-22.asm.bellsouth.net 66.20.184.22
| > | > | Path:
cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP09.phx.gbl
| > | > | Xref: cpmsftngxa06.phx.gbl
| > | microsoft.public.dotnet.languages.csharp:192183
| > | > | X-Tomcat-NG: microsoft.public.dotnet.languages.csharp
| > | > |
| > | > | I need to save a DWORD to the sql server, the below posts an
error,
| > any
| > | > | suggestions on what I am doing wrong. I have the column in the
sql
| > | server
| > | > | defined as an int since unsigned int is not valid. Also trying to
| > avoid
| > | > | setting it to a bigint in the server. Casting an int to an uint
use
| > to
| > | > work
| > | > | in C++.
| > | > |
| > | > |
| > | > | System.Data.SqlClient.SqlConnection cn = new
| > | > | System.Data.SqlClient.SqlConnection(...);
| > | > | cn.Open()
| > | > | System.Data.SqlClient.SqlCommand cmd = new
| > | > | System.Data.SqlClient.SqlCommand();
| > | > | cmd.Connection = cn;
| > | > |
| > | > | cmd.Parameters.Add("@PS", System.Data.SqlDbType.Int);
| > | > | cmd.Parameters["@PS"].Value = UInt32.MaxValue;
| > | > | cmd.CommandText = "UPDATE Directories SET State = @PS WHERE
| > AreaCode
| > | =
| > | > ''
| > | > | AND Number = '104'";
| > | > |
| > | > | cmd.ExecuteNonQuery(); // error here !!!!
| > | > | // An unhandled
| exception
| > of
| > | > | type 'System.OverflowException' occurred in system.data.dll
| > | > | // Additional
| information:
| > | > Value
| > | > | was either too large or too small for an Int32.
| > | > |
| > | > |
| > | > | cmd.Parameters.RemoveAt("@PS");
| > | > | cmd.CommandText = "SELECT State FROM Directories WHERE
AreaCode =
| > ''
| > | > AND
| > | > | Number = '104'";
| > | > | System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
| > | > | if(dr.Read())
| > | > | {
| > | > | uint val = Convert.ToUInt32(dr["PhoneState"]); // same error
| here
| > if
| > | I
| > | > | force the value in
| > | > | }
| > | > | dr.Close();
| > | > | cn.Close();
| > | > |
| > | > | This works sort of:
| > | > |
| > | > | UPDATE Directories SET State = 0xffffffff WHERE AreaCode = '' AND
| > Number
| > | =
| > | > | '104'
| > | > | SELECT CONVERT(Binary, State) FROM Directories WHERE AreaCode = ''
| AND
| > | > | Number = '104'
| > | > |
| > | > | So I know the SQL server is storing the data correctly, the
problem
| is
| > | > NET
| > | > | can not convert it. Also if I look at the debuging code the
system
| > | shows
| > | > | this on the return value:
| > | > |
| > | > | - dr["State"] {0xffffffff} System.Int32
| > | > | + System.ValueType {System.Int32} System.ValueType
| > | > | m_value 0xffffffff int
| > | > | MaxValue 0x7fffffff int
| > | > | MinValue 0x80000000 int
| > | > |
| > | > |
| > | > | Thanks,
| > | > | John
| > | > |
| > | > |
| > | > |
| > | >
| > |
| > |
| > |
| >
|
|
|
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top