|
1 | 1 | import ctypes |
| 2 | +import datetime |
2 | 3 | import ddbc_bindings |
3 | 4 | import os |
4 | 5 |
|
@@ -68,6 +69,7 @@ def fetch_data_all(stmt_handle): |
68 | 69 | def fetch_data(stmt_handle): |
69 | 70 | rows = [] |
70 | 71 | column_count = ddbc_bindings.DDBCSQLNumResultCols(stmt_handle.value) |
| 72 | + print("Number of columns = " + str(column_count)) |
71 | 73 | while True: |
72 | 74 | result = ddbc_bindings.DDBCSQLFetch(stmt_handle.value) |
73 | 75 | if result == SQL_NO_DATA: |
@@ -98,6 +100,97 @@ def connect_to_db(dbc_handle, connection_string): |
98 | 100 | print("Error:", ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle.value, result)) |
99 | 101 | raise RuntimeError(f"SQLDriverConnect failed. Error code: {result}") |
100 | 102 |
|
| 103 | +def add_string_param(params, paramInfos, data_string): |
| 104 | + params.append(data_string) |
| 105 | + paramInfo = ddbc_bindings.ParamInfo() |
| 106 | + paramInfo.paramCType = 1 # SQL_C_CHAR |
| 107 | + paramInfo.paramSQLType = 12 # SQL_VARCHAR |
| 108 | + paramInfo.columnSize = len(data_string) |
| 109 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 110 | + paramInfos.append(paramInfo) |
| 111 | + |
| 112 | +def add_wstring_param(params, paramInfos, wide_string): |
| 113 | + params.append(wide_string) |
| 114 | + paramInfo = ddbc_bindings.ParamInfo() |
| 115 | + paramInfo.paramCType = -8 # SQL_C_WCHAR |
| 116 | + paramInfo.paramSQLType = -9 # SQL_WVARCHAR |
| 117 | + paramInfo.columnSize = len(wide_string) |
| 118 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 119 | + paramInfos.append(paramInfo) |
| 120 | + |
| 121 | +def add_date_param(params, paramInfos): |
| 122 | + date_obj = datetime.date(2025, 1, 28) # 28th Jan 2025 |
| 123 | + params.append(date_obj) |
| 124 | + paramInfo = ddbc_bindings.ParamInfo() |
| 125 | + paramInfo.paramCType = 91 # SQL_C_TYPE_DATE |
| 126 | + paramInfo.paramSQLType = 91 # SQL_TYPE_DATE |
| 127 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 128 | + paramInfos.append(paramInfo) |
| 129 | + |
| 130 | +def add_time_param(params, paramInfos): |
| 131 | + time_obj = datetime.time(5, 15, 30) # 5:15 AM + 30 secs |
| 132 | + params.append(time_obj) |
| 133 | + paramInfo = ddbc_bindings.ParamInfo() |
| 134 | + paramInfo.paramCType = 92 # SQL_C_TYPE_TIME |
| 135 | + paramInfo.paramSQLType = 92 # SQL_TYPE_TIME |
| 136 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 137 | + paramInfos.append(paramInfo) |
| 138 | + |
| 139 | +def add_datetime_param(params, paramInfos, addNone): |
| 140 | + paramInfo = ddbc_bindings.ParamInfo() |
| 141 | + if addNone: |
| 142 | + params.append(None) |
| 143 | + paramInfo.paramCType = 99 # SQL_C_DEFAULT |
| 144 | + else: |
| 145 | + datetime_obj = datetime.datetime(2025, 1, 28, 5, 15, 30) |
| 146 | + params.append(datetime_obj) |
| 147 | + paramInfo.paramCType = 93 # SQL_C_TYPE_TIMESTAMP |
| 148 | + paramInfo.paramSQLType = 93 # SQL_TYPE_TIMESTAMP |
| 149 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 150 | + paramInfos.append(paramInfo) |
| 151 | + |
| 152 | +def add_bool_param(params, paramInfos, bool_val): |
| 153 | + params.append(bool_val) |
| 154 | + paramInfo = ddbc_bindings.ParamInfo() |
| 155 | + paramInfo.paramCType = -7 # SQL_C_BIT |
| 156 | + paramInfo.paramSQLType = -7 # SQL_BIT |
| 157 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 158 | + paramInfos.append(paramInfo) |
| 159 | + |
| 160 | +def add_tinyint_param(params, paramInfos, val): |
| 161 | + params.append(val) |
| 162 | + paramInfo = ddbc_bindings.ParamInfo() |
| 163 | + paramInfo.paramCType = -6 # SQL_C_TINYINT |
| 164 | + paramInfo.paramSQLType = -6 # SQL_TINYINT |
| 165 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 166 | + paramInfos.append(paramInfo) |
| 167 | + |
| 168 | +def add_bigint_param(params, paramInfos, val): |
| 169 | + params.append(val) |
| 170 | + paramInfo = ddbc_bindings.ParamInfo() |
| 171 | + paramInfo.paramCType = -25 # SQL_C_SBIGINT |
| 172 | + paramInfo.paramSQLType = -5 # SQL_BIGINT |
| 173 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 174 | + paramInfos.append(paramInfo) |
| 175 | + |
| 176 | +def add_float_param(params, paramInfos, val): |
| 177 | + params.append(val) |
| 178 | + paramInfo = ddbc_bindings.ParamInfo() |
| 179 | + paramInfo.paramCType = 7 # SQL_C_FLOAT |
| 180 | + paramInfo.paramSQLType = 7 # SQL_REAL |
| 181 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 182 | + paramInfo.columnSize = 15 # Precision |
| 183 | + paramInfos.append(paramInfo) |
| 184 | + |
| 185 | +def add_double_param(params, paramInfos, val): |
| 186 | + params.append(val) |
| 187 | + paramInfo = ddbc_bindings.ParamInfo() |
| 188 | + paramInfo.paramCType = 8 # SQL_C_DOUBLE |
| 189 | + paramInfo.paramSQLType = 8 # SQL_DOUBLE |
| 190 | + paramInfo.inputOutputType = 1 # SQL_PARAM_INPUT |
| 191 | + paramInfo.columnSize = 15 # Precision |
| 192 | + paramInfos.append(paramInfo) |
| 193 | + |
101 | 194 | if __name__ == "__main__": |
102 | 195 | # Allocate environment handle |
103 | 196 | env_handle = alloc_handle(SQL_HANDLE_ENV, 0) |
@@ -134,20 +227,42 @@ def connect_to_db(dbc_handle, connection_string): |
134 | 227 | ''' |
135 | 228 | # Test DDBCSQLExecute for INSERT query |
136 | 229 | print("Test DDBCSQLExecute insert") |
137 | | - insert_sql_query = "INSERT INTO customers (name, email) VALUES (?, ?);" |
138 | | - params = ['gaurav', 'gaurav@gaurav.com'] |
| 230 | + ''' |
| 231 | + insert_sql_query = """ |
| 232 | + ALTER TABLE [Employees].[dbo].[EmployeeFullNames] |
| 233 | + ADD date_ DATE, |
| 234 | + time_ TIME, |
| 235 | + datetime_ TIMESTAMP, |
| 236 | + wchar_ NVARCHAR(10), |
| 237 | + bool_ BIT, |
| 238 | + tinyint_ TINYINT, |
| 239 | + bigint_ BIGINT, |
| 240 | + float_ FLOAT(10), |
| 241 | + double_ DOUBLE PRECISION; |
| 242 | +
|
| 243 | + """ |
| 244 | + ''' |
| 245 | + insert_sql_query = "INSERT INTO [Employees].[dbo].[EmployeeFullNames] (FirstName, LastName, date_, time_, wchar_, bool_, tinyint_, bigint_, float_, double_) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" |
| 246 | + params = [] |
139 | 247 | param_info_list = [] |
140 | | - for i in params: |
141 | | - paraminfo = ParamInfo() |
142 | | - paraminfo.paramCType = 1 |
143 | | - paraminfo.paramSQLType = 12 |
144 | | - param_info_list.append(paraminfo) |
| 248 | + add_string_param(params, param_info_list, 'Harry') |
| 249 | + add_string_param(params, param_info_list, 'Potter2') |
| 250 | + add_date_param(params, param_info_list) |
| 251 | + add_time_param(params, param_info_list) |
| 252 | + # add_datetime_param(params, param_info_list, addNone=True) - Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column. Traceback (most recent call last): |
| 253 | + add_wstring_param(params, param_info_list, u"Wide str3") |
| 254 | + add_bool_param(params, param_info_list, True) |
| 255 | + add_tinyint_param(params, param_info_list, 127) |
| 256 | + add_bigint_param(params, param_info_list, 123456789) |
| 257 | + add_float_param(params, param_info_list, 12.34) |
| 258 | + add_double_param(params, param_info_list, 12.34) |
145 | 259 | result = ddbc_sql_execute(stmt_handle, insert_sql_query, params, param_info_list, True) |
146 | 260 | print("DDBCSQLExecute result:", result) |
147 | 261 |
|
148 | 262 | # Test DDBCSQLExecute for SELECT query |
149 | 263 | print("Test DDBCSQLExecute select") |
150 | | - select_sql_query = "SELECT * FROM customers;" |
| 264 | + # select_sql_query = "SELECT * FROM customers;" |
| 265 | + select_sql_query = "SELECT bool_, float_, wchar_, date_, time_, datetime_, wchar_, FirstName, LastName FROM [Employees].[dbo].[EmployeeFullNames];" |
151 | 266 | params = [] |
152 | 267 | param_info_list = [] |
153 | 268 | result = ddbc_sql_execute(stmt_handle, select_sql_query, params, param_info_list, False) |
|
0 commit comments