2 * Firebird ADO.NET Data provider for .NET and Mono
4 * The contents of this file are subject to the Initial
5 * Developer's Public License Version 1.0 (the "License");
6 * you may not use this file except in compliance with the
7 * License. You may obtain a copy of the License at
8 * http://www.firebirdsql.org/index.php?op=doc&id=idpl
10 * Software distributed under the License is distributed on
11 * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
12 * express or implied. See the License for the specific
13 * language governing rights and limitations under the License.
15 * Copyright (c) 2002, 2004 Carlos Guzman Alvarez
16 * All Rights Reserved.
19 using NUnit.Framework;
22 using FirebirdSql.Data.Firebird;
24 namespace FirebirdSql.Data.Firebird.Tests
27 public class FbDataAdapterTest : BaseTest
29 public FbDataAdapterTest() : base(false)
34 public void FillTest()
36 FbTransaction transaction = this.Connection.BeginTransaction();
37 FbCommand command = new FbCommand("select * from TEST", Connection, transaction);
38 FbDataAdapter adapter = new FbDataAdapter(command);
40 FbCommandBuilder builder = new FbCommandBuilder(adapter);
42 DataSet ds = new DataSet();
43 adapter.Fill(ds, "TEST");
45 Assert.AreEqual(100, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
48 Console.WriteLine("DataAdapter - Fill Method - Test");
50 foreach (DataTable table in ds.Tables)
52 foreach (DataColumn col in table.Columns)
54 Console.Write(col.ColumnName + "\t\t");
59 foreach (DataRow row in table.Rows)
61 for (int i = 0; i < table.Columns.Count; i++)
63 Console.Write(row[i] + "\t\t");
66 Console.WriteLine("");
77 public void FillMultipleTest()
79 FbTransaction transaction = this.Connection.BeginTransaction();
80 FbCommand command = new FbCommand("select * from TEST", Connection, transaction);
81 FbDataAdapter adapter = new FbDataAdapter(command);
83 FbCommandBuilder builder = new FbCommandBuilder(adapter);
85 DataSet ds1 = new DataSet();
86 DataSet ds2 = new DataSet();
88 adapter.Fill(ds1, "TEST");
89 adapter.Fill(ds2, "TEST");
91 Assert.AreEqual(100, ds1.Tables["TEST"].Rows.Count, "Incorrect row count (ds1)");
92 Assert.AreEqual(100, ds2.Tables["TEST"].Rows.Count, "Incorrect row count (ds2)");
101 public void FillMultipleWithImplicitTransactionTest()
103 FbCommand command = new FbCommand("select * from TEST", Connection);
104 FbDataAdapter adapter = new FbDataAdapter(command);
106 FbCommandBuilder builder = new FbCommandBuilder(adapter);
108 DataSet ds1 = new DataSet();
109 DataSet ds2 = new DataSet();
111 adapter.Fill(ds1, "TEST");
112 adapter.Fill(ds2, "TEST");
114 Assert.AreEqual(100, ds1.Tables["TEST"].Rows.Count, "Incorrect row count (ds1)");
115 Assert.AreEqual(100, ds2.Tables["TEST"].Rows.Count, "Incorrect row count (ds2)");
123 public void InsertTest()
125 FbTransaction transaction = this.Connection.BeginTransaction();
126 FbCommand command = new FbCommand("select * from TEST", Connection, transaction);
127 FbDataAdapter adapter = new FbDataAdapter(command);
129 FbCommandBuilder builder = new FbCommandBuilder(adapter);
131 DataSet ds = new DataSet();
132 adapter.Fill(ds, "TEST");
134 Assert.AreEqual(100, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
136 DataRow newRow = ds.Tables["TEST"].NewRow();
138 newRow["int_field"] = 101;
139 newRow["CHAR_FIELD"] = "ONE THOUSAND";
140 newRow["VARCHAR_FIELD"] = ":;,.{}`+^*[]\\!|@#$%&/()?_-<>";
141 newRow["BIGint_field"] = 100000;
142 newRow["SMALLint_field"] = 100;
143 newRow["DOUBLE_FIELD"] = 100.01;
144 newRow["NUMERIC_FIELD"] = 100.01;
145 newRow["DECIMAL_FIELD"] = 100.01;
146 newRow["DATE_FIELD"] = new DateTime(100, 10, 10);
147 newRow["TIME_FIELD"] = new DateTime(100, 10, 10, 10, 10, 10, 10);
148 newRow["TIMESTAMP_FIELD"] = new DateTime(100, 10, 10, 10, 10, 10, 10);
149 newRow["CLOB_FIELD"] = "ONE THOUSAND";
151 ds.Tables["TEST"].Rows.Add(newRow);
153 adapter.Update(ds, "TEST");
158 transaction.Commit();
162 public void UpdateCharTest()
164 string sql = "select * from TEST where int_field = @int_field";
165 FbTransaction transaction = this.Connection.BeginTransaction();
166 FbCommand command = new FbCommand(sql, Connection, transaction);
167 FbDataAdapter adapter = new FbDataAdapter(command);
169 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
171 FbCommandBuilder builder = new FbCommandBuilder(adapter);
173 DataSet ds = new DataSet();
174 adapter.Fill(ds, "TEST");
176 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
178 ds.Tables["TEST"].Rows[0]["CHAR_FIELD"] = "ONE THOUSAND";
180 adapter.Update(ds, "TEST");
186 transaction.Commit();
188 transaction = Connection.BeginTransaction();
190 sql = "SELECT char_field FROM TEST WHERE int_field = @int_field";
191 command = new FbCommand(sql, Connection, transaction);
192 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
194 string val = (string)command.ExecuteScalar();
196 transaction.Commit();
198 Assert.AreEqual("ONE THOUSAND", val.Trim(), "char_field has not correct value");
202 public void UpdateVarCharTest()
204 string sql = "select * from TEST where int_field = @int_field";
205 FbTransaction transaction = this.Connection.BeginTransaction();
206 FbCommand command = new FbCommand(sql, Connection, transaction);
207 FbDataAdapter adapter = new FbDataAdapter(command);
209 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
211 FbCommandBuilder builder = new FbCommandBuilder(adapter);
213 DataSet ds = new DataSet();
214 adapter.Fill(ds, "TEST");
216 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
218 ds.Tables["TEST"].Rows[0]["VARCHAR_FIELD"] = "ONE VAR THOUSAND";
220 adapter.Update(ds, "TEST");
226 transaction.Commit();
228 transaction = Connection.BeginTransaction();
230 sql = "SELECT varchar_field FROM TEST WHERE int_field = @int_field";
231 command = new FbCommand(sql, Connection, transaction);
232 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
234 string val = (string)command.ExecuteScalar();
236 transaction.Commit();
238 Assert.AreEqual("ONE VAR THOUSAND", val.Trim(), "varchar_field has not correct value");
242 public void UpdateSmallIntTest()
244 string sql = "select * from TEST where int_field = @int_field";
245 FbTransaction transaction = this.Connection.BeginTransaction();
246 FbCommand command = new FbCommand(sql, Connection, transaction);
247 FbDataAdapter adapter = new FbDataAdapter(command);
249 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
251 FbCommandBuilder builder = new FbCommandBuilder(adapter);
253 DataSet ds = new DataSet();
254 adapter.Fill(ds, "TEST");
256 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
258 ds.Tables["TEST"].Rows[0]["SMALLint_field"] = System.Int16.MaxValue;
260 adapter.Update(ds, "TEST");
266 transaction.Commit();
268 transaction = Connection.BeginTransaction();
270 sql = "SELECT smallint_field FROM TEST WHERE int_field = @int_field";
271 command = new FbCommand(sql, Connection, transaction);
272 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
274 short val = (short)command.ExecuteScalar();
276 transaction.Commit();
278 Assert.AreEqual(System.Int16.MaxValue, val, "smallint_field has not correct value");
282 public void UpdateBigIntTest()
284 string sql = "select * from TEST where int_field = @int_field";
285 FbTransaction transaction = this.Connection.BeginTransaction();
286 FbCommand command = new FbCommand(sql, Connection, transaction);
287 FbDataAdapter adapter = new FbDataAdapter(command);
289 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
291 FbCommandBuilder builder = new FbCommandBuilder(adapter);
293 DataSet ds = new DataSet();
294 adapter.Fill(ds, "TEST");
296 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
298 ds.Tables["TEST"].Rows[0]["BIGINT_FIELD"] = System.Int32.MaxValue;
300 adapter.Update(ds, "TEST");
306 transaction.Commit();
308 transaction = Connection.BeginTransaction();
310 sql = "SELECT bigint_field FROM TEST WHERE int_field = @int_field";
311 command = new FbCommand(sql, Connection, transaction);
312 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
314 long val = (long)command.ExecuteScalar();
316 transaction.Commit();
318 Assert.AreEqual(System.Int32.MaxValue, val, "bigint_field has not correct value");
322 public void UpdateDoubleTest()
324 string sql = "select * from TEST where int_field = @int_field";
325 FbTransaction transaction = this.Connection.BeginTransaction();
326 FbCommand command = new FbCommand(sql, Connection, transaction);
327 FbDataAdapter adapter = new FbDataAdapter(command);
329 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
331 FbCommandBuilder builder = new FbCommandBuilder(adapter);
333 DataSet ds = new DataSet();
334 adapter.Fill(ds, "TEST");
336 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
338 ds.Tables["TEST"].Rows[0]["DOUBLE_FIELD"] = System.Int32.MaxValue;
340 adapter.Update(ds, "TEST");
346 transaction.Commit();
348 transaction = Connection.BeginTransaction();
350 sql = "SELECT double_field FROM TEST WHERE int_field = @int_field";
351 command = new FbCommand(sql, Connection, transaction);
352 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
354 double val = (double)command.ExecuteScalar();
356 transaction.Commit();
358 Assert.AreEqual(System.Int32.MaxValue, val, "double_field has not correct value");
362 public void UpdateNumericTest()
364 string sql = "select * from TEST where int_field = @int_field";
365 FbTransaction transaction = this.Connection.BeginTransaction();
366 FbCommand command = new FbCommand(sql, Connection, transaction);
367 FbDataAdapter adapter = new FbDataAdapter(command);
369 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
371 FbCommandBuilder builder = new FbCommandBuilder(adapter);
373 DataSet ds = new DataSet();
374 adapter.Fill(ds, "TEST");
376 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
378 ds.Tables["TEST"].Rows[0]["NUMERIC_FIELD"] = System.Int32.MaxValue;
380 adapter.Update(ds, "TEST");
386 transaction.Commit();
388 transaction = Connection.BeginTransaction();
390 sql = "SELECT numeric_field FROM TEST WHERE int_field = @int_field";
391 command = new FbCommand(sql, Connection, transaction);
392 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
394 decimal val = (decimal)command.ExecuteScalar();
396 transaction.Commit();
398 Assert.AreEqual(System.Int32.MaxValue, val, "numeric_field has not correct value");
402 public void UpdateDecimalTest()
404 string sql = "select * from TEST where int_field = @int_field";
405 FbTransaction transaction = this.Connection.BeginTransaction();
406 FbCommand command = new FbCommand(sql, Connection, transaction);
407 FbDataAdapter adapter = new FbDataAdapter(command);
409 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
411 FbCommandBuilder builder = new FbCommandBuilder(adapter);
413 DataSet ds = new DataSet();
414 adapter.Fill(ds, "TEST");
416 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
418 ds.Tables["TEST"].Rows[0]["DECIMAL_FIELD"] = System.Int32.MaxValue;
420 adapter.Update(ds, "TEST");
426 transaction.Commit();
428 transaction = Connection.BeginTransaction();
430 sql = "SELECT decimal_field FROM TEST WHERE int_field = @int_field";
431 command = new FbCommand(sql, Connection, transaction);
432 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
434 decimal val = (decimal)command.ExecuteScalar();
436 transaction.Commit();
438 Assert.AreEqual(System.Int32.MaxValue, val, "decimal_field has not correct value");
442 public void UpdateDateTest()
444 string sql = "select * from TEST where int_field = @int_field";
445 FbTransaction transaction = this.Connection.BeginTransaction();
446 FbCommand command = new FbCommand(sql, Connection, transaction);
447 FbDataAdapter adapter = new FbDataAdapter(command);
449 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
451 FbCommandBuilder builder = new FbCommandBuilder(adapter);
453 DataSet ds = new DataSet();
454 adapter.Fill(ds, "TEST");
456 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
458 DateTime dtValue = DateTime.Now;
460 ds.Tables["TEST"].Rows[0]["DATE_FIELD"] = dtValue;
462 adapter.Update(ds, "TEST");
468 transaction.Commit();
470 transaction = Connection.BeginTransaction();
472 sql = "SELECT date_field FROM TEST WHERE int_field = @int_field";
473 command = new FbCommand(sql, Connection, transaction);
474 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
476 DateTime val = (DateTime)command.ExecuteScalar();
478 transaction.Commit();
480 Assert.AreEqual(dtValue.Day, val.Day, "date_field has not correct day");
481 Assert.AreEqual(dtValue.Month, val.Month, "date_field has not correct month");
482 Assert.AreEqual(dtValue.Year, val.Year, "date_field has not correct year");
486 public void UpdateTimeTest()
488 string sql = "select * from TEST where int_field = @int_field";
489 FbTransaction transaction = this.Connection.BeginTransaction();
490 FbCommand command = new FbCommand(sql, Connection, transaction);
491 FbDataAdapter adapter = new FbDataAdapter(command);
493 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
495 FbCommandBuilder builder = new FbCommandBuilder(adapter);
497 DataSet ds = new DataSet();
498 adapter.Fill(ds, "TEST");
500 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
502 DateTime dtValue = DateTime.Now;
504 ds.Tables["TEST"].Rows[0]["TIME_FIELD"] = dtValue;
506 adapter.Update(ds, "TEST");
512 transaction.Commit();
514 transaction = Connection.BeginTransaction();
516 sql = "SELECT time_field FROM TEST WHERE int_field = @int_field";
517 command = new FbCommand(sql, Connection, transaction);
518 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
520 DateTime val = (DateTime)command.ExecuteScalar();
522 transaction.Commit();
524 Assert.AreEqual(dtValue.Hour, val.Hour, "time_field has not correct hour");
525 Assert.AreEqual(dtValue.Minute, val.Minute, "time_field has not correct minute");
526 Assert.AreEqual(dtValue.Second, val.Second, "time_field has not correct second");
530 public void UpdateTimeStampTest()
532 string sql = "select * from TEST where int_field = @int_field";
533 FbTransaction transaction = this.Connection.BeginTransaction();
534 FbCommand command = new FbCommand(sql, Connection, transaction);
535 FbDataAdapter adapter = new FbDataAdapter(command);
537 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
539 FbCommandBuilder builder = new FbCommandBuilder(adapter);
541 DataSet ds = new DataSet();
542 adapter.Fill(ds, "TEST");
544 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
546 DateTime dtValue = DateTime.Now;
548 ds.Tables["TEST"].Rows[0]["TIMESTAMP_FIELD"] = dtValue;
550 adapter.Update(ds, "TEST");
556 transaction.Commit();
558 transaction = Connection.BeginTransaction();
560 sql = "SELECT timestamp_field FROM TEST WHERE int_field = @int_field";
561 command = new FbCommand(sql, Connection, transaction);
562 command.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
564 DateTime val = (DateTime)command.ExecuteScalar();
566 transaction.Commit();
568 Assert.AreEqual(dtValue.Day, val.Day, "timestamp_field has not correct day");
569 Assert.AreEqual(dtValue.Month, val.Month, "timestamp_field has not correct month");
570 Assert.AreEqual(dtValue.Year, val.Year, "timestamp_field has not correct year");
571 Assert.AreEqual(dtValue.Hour, val.Hour, "timestamp_field has not correct hour");
572 Assert.AreEqual(dtValue.Minute, val.Minute, "timestamp_field has not correct minute");
573 Assert.AreEqual(dtValue.Second, val.Second, "timestamp_field has not correct second");
577 public void UpdateClobTest()
579 string sql = "select * from TEST where int_field = @int_field";
580 FbTransaction transaction = this.Connection.BeginTransaction();
581 FbCommand command = new FbCommand(sql, Connection, transaction);
582 FbDataAdapter adapter = new FbDataAdapter(command);
584 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 1;
586 FbCommandBuilder builder = new FbCommandBuilder(adapter);
588 DataSet ds = new DataSet();
589 adapter.Fill(ds, "TEST");
591 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
593 ds.Tables["TEST"].Rows[0]["CLOB_FIELD"] = "ONE THOUSAND";
595 adapter.Update(ds, "TEST");
600 transaction.Commit();
604 public void DeleteTest()
606 string sql = "select * from TEST where int_field = @int_field";
607 FbTransaction transaction = this.Connection.BeginTransaction();
608 FbCommand command = new FbCommand(sql, Connection, transaction);
609 FbDataAdapter adapter = new FbDataAdapter(command);
611 adapter.SelectCommand.Parameters.Add("@int_field", FbDbType.Integer).Value = 10;
613 FbCommandBuilder builder = new FbCommandBuilder(adapter);
615 DataSet ds = new DataSet();
616 adapter.Fill(ds, "TEST");
618 Assert.AreEqual(1, ds.Tables["TEST"].Rows.Count, "Incorrect row count");
620 ds.Tables["TEST"].Rows[0].Delete();
622 adapter.Update(ds, "TEST");
627 transaction.Commit();
631 public void SubsequentDeletes()
633 string selectSql = "SELECT * FROM test";
634 string deleteSql = "DELETE FROM test WHERE int_field = @id";
636 // Set up conenction and select/delete commands
637 FbConnection connection = new FbConnection(this.Connection.ConnectionString);
638 FbCommand select = new FbCommand(selectSql, connection);
639 FbCommand delete = new FbCommand(deleteSql, connection);
640 delete.Parameters.Add("@id", FbDbType.Integer);
641 delete.Parameters[0].SourceColumn = "INT_FIELD";
643 // Set up the FbDataAdapter
644 FbDataAdapter adapter = new FbDataAdapter(select);
645 adapter.DeleteCommand = delete;
648 DataSet ds = new DataSet();
652 ds.Tables[0].Rows[0].Delete();
655 // Delete another row
656 ds.Tables[0].Rows[0].Delete();
659 // Delete another row
660 ds.Tables[0].Rows[0].Delete();
665 [Ignore("Not supported")]
666 public void MultipleResultsetTest()
668 FbCommand command = new FbCommand("", this.Connection);
670 command.CommandText = "select * from test;";
671 command.CommandText += "select int_field from test;";
672 command.CommandText += "select int_field, char_field from test;";
674 FbDataAdapter adapter = new FbDataAdapter(command);
676 DataSet ds = new DataSet();
680 Assert.AreEqual(3, ds.Tables.Count, "Incorrect tables count");