* OdbcCommand.cs: No longer use OdbcConnection.Datareader, in order
[mono.git] / mcs / class / System.Data / System.Data.Odbc / OdbcParameter.cs
1 //
2 // System.Data.Odbc.OdbcParameter
3 //
4 // Authors:
5 //   Brian Ritchie (brianlritchie@hotmail.com)
6 //
7 // Copyright (C) Brian Ritchie, 2002
8 //
9
10 using System;
11 using System.Data;
12 using System.Data.Common;
13
14 namespace System.Data.Odbc
15 {
16         public sealed class OdbcParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
17         {
18                 #region Fields
19
20                 string name;
21                 object ParamValue;
22                 int size;
23                 bool isNullable;
24                 byte precision;
25                 byte scale;
26                 DataRowVersion sourceVersion;
27                 string sourceColumn;
28                 ParameterDirection direction;
29                 OdbcType odbcType;
30                 DbType dbType;
31                 OdbcParameterCollection container = null;       
32                 
33                 // Buffers for parameter value based on type. Currently I've only optimized 
34                 // for int parameters and everything else is just converted to a string.
35                 private bool bufferIsSet;
36                 int intbuf;
37                 byte[] buffer;
38
39                 #endregion
40
41                 #region Constructors
42                 
43                 public OdbcParameter ()
44                 {
45                         name = String.Empty;
46                         ParamValue = null;
47                         size = 0;
48                         isNullable = true;
49                         precision = 0;
50                         scale = 0;
51                         sourceColumn = String.Empty;
52                 }
53
54                 public OdbcParameter (string name, object value) 
55                         : this ()
56                 {
57                         this.name = name;
58                         this.ParamValue = value;
59                 }
60
61                 public OdbcParameter (string name, OdbcType dataType) 
62                         : this ()
63                 {
64                         this.name = name;
65                         OdbcType = dataType;
66                 }
67
68                 public OdbcParameter (string name, OdbcType dataType, int size)
69                         : this (name, dataType)
70                 {
71                         this.size = size;
72                 }
73
74                 public OdbcParameter (string name, OdbcType dataType, int size, string srcColumn)
75                         : this (name, dataType, size)
76                 {
77                         this.sourceColumn = srcColumn;
78                 }
79
80                 public OdbcParameter(string name, OdbcType dataType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
81                         : this (name, dataType, size, srcColumn)
82                 {
83                         this.direction = direction;
84                         this.isNullable = isNullable;
85                         this.precision = precision;
86                         this.scale = scale;
87                         this.sourceVersion = srcVersion;
88                         this.ParamValue = value;
89                 }
90
91                 #endregion
92
93                 #region Properties
94
95                 // Used to ensure that only one collection can contain this
96                 // parameter
97                 internal OdbcParameterCollection Container {
98                         get { return container; }
99                         set { container = value; }
100                 }
101
102                 public DbType DbType {
103                         get { return dbType; }
104                         set { 
105                                 dbType = value;
106                         }
107                 }
108                 
109                 public ParameterDirection Direction {
110                         get { return direction; }
111                         set { direction = value; }
112                 }
113                 
114                 public bool IsNullable {
115                         get { return isNullable; }\r
116                         set { isNullable = value; }\r
117                 }
118
119                 public OdbcType OdbcType {
120                         get { return odbcType; }
121                         set {
122                                 odbcType = value;
123                         }
124                 }
125                 
126                 public string ParameterName {
127                         get { return name; }
128                         set { name = value; }
129                 }
130
131                 public byte Precision {
132                         get { return precision; }
133                         set { precision = value; }
134                 }
135                 
136                 public byte Scale {
137                         get { return scale; }
138                         set { scale = value; }
139                 }
140                 
141                 public int Size {
142                         get { return size; }
143                         set { size = value; }
144                 }
145
146                 public string SourceColumn {
147                         get { return sourceColumn; }
148                         set { sourceColumn = value; }
149                 }
150                 
151                 public DataRowVersion SourceVersion {
152                         get { return sourceVersion; }
153                         set { sourceVersion = value; }
154                 }
155                 
156                 public object Value {
157                         get { 
158                                 return ParamValue;
159                         }
160                         set { 
161                                 this.ParamValue = value;
162                                 bufferIsSet = false;
163                         }
164                 }
165
166                 #endregion // Properties
167
168                 #region Methods\r
169 \r
170                 internal void Bind(IntPtr hstmt, int ParamNum) {\r
171                         OdbcReturn ret;\r
172                         // Set up the buffer if we haven't done so yet\r
173                         if (!bufferIsSet)\r
174                                 setBuffer();\r
175 \r
176                         // Convert System.Data.ParameterDirection into odbc enum\r
177                         OdbcInputOutputDirection paramdir = libodbc.ConvertParameterDirection(this.direction);\r
178                         // Bind parameter based on type\r
179                         if (odbcType == OdbcType.Int)\r
180                                 ret = libodbc.SQLBindParameter(hstmt, (ushort)ParamNum, (short)paramdir,\r
181                                         (short)odbcType, (short)odbcType, Convert.ToUInt32(size),\r
182                                         0, ref intbuf, 0, 0);\r
183                         else\r
184                                 ret = libodbc.SQLBindParameter(hstmt, (ushort)ParamNum, (short)paramdir,\r
185                                         (short)OdbcType.Char, (short)odbcType, Convert.ToUInt32(size),\r
186                                         0, buffer, 0, 0);\r
187                         // Check for error condition\r
188                         if ((ret != OdbcReturn.Success) && (ret != OdbcReturn.SuccessWithInfo))\r
189                                 throw new OdbcException(new OdbcError("SQLBindParam", OdbcHandleType.Stmt, hstmt));\r
190                 }\r
191 \r
192                 private void setBuffer() {\r
193                         // Load buffer with new value\r
194                         if (odbcType == OdbcType.Int)\r
195                                 intbuf = (int)ParamValue;\r
196                         else {\r
197                                 string paramValueString = ParamValue.ToString();\r
198                                 // Treat everything else as a string\r
199                                 // Init string buffer\r
200                                 if (buffer == null || buffer.Length < ((size > 20) ? size : 20))\r
201                                         buffer = new byte[(size > 20) ? size : 20];\r
202                                 else\r
203                                         buffer.Initialize();\r
204                                 // Convert value into string and store into buffer\r
205                                 System.Text.Encoding.ASCII.GetBytes(paramValueString, 0, paramValueString.Length, buffer, 0);\r
206                         }\r
207                         bufferIsSet = true;\r
208                 }\r
209 \r
210                 [MonoTODO]
211                 object ICloneable.Clone ()
212                 {
213                         throw new NotImplementedException ();
214                 }
215
216                 public override string ToString ()
217                 {
218                         return ParameterName;
219                 }
220                 #endregion
221         }
222 }