diff --git a/doc/BulkSql.md b/doc/BulkSql.md new file mode 100644 index 0000000..3a69ee0 --- /dev/null +++ b/doc/BulkSql.md @@ -0,0 +1,71 @@ +## Bulk Operation + + +If you want to insert, update or delete many rows at a time from a database, the most efficient way is to minimize the number of round trips. +Oracle has this built in to the client api, but using it is rather cumbersome to use. +Dapper.Oracle contains some extension methods that makes this easier. + +Consider the following class, a simplified dataaccess: + +``` +public class CustomerDAL + { + public IDbConnection Connection { get; } + + public CustomerDAL(IDbConnection connection) + { + Connection = connection; + } + + public void InsertCustomers(IEnumerable customers) + { + string insertSql = "INSERT INTO CUSTOMERS(CUSTOMERID,NAME,ADDRESS,POSTALCODE,CITY) VALUES(:CUSTOMERID,:NAME,:POSTALCODE,:CITY)"; + foreach (var customer in customers) + { + var parameters = new OracleDynamicParameters(); + parameters.Add("CUSTOMERID",customer.CustomerId); + parameters.Add("NAME",customer.Name); + parameters.Add("ADDRESS",customer.Address); + parameters.Add("POSTALCODE",customer.Address); + parameters.Add("POSTALCODE", customer.PostalCode); + parameters.Add("CITY",customer.City); + Connection.Execute(insertSql, parameters); + + } + } + } +``` +The method InsertCustomers takes in a `IEnumerable`, and iterates over it, inserting customers into the database. +This is a fairly common pattern, but it has some drawbacks, the biggest one being that it performs a full database roundtrip per row to insert into the database. +A much better approach is to send over an array of parameters, and have the database execute all statements in a single roundtrip. +This allows for > 1000 inserts/second. + +The same class, rewritten using Dapper.Oracle Bulk Sql + +``` +public class CustomerDAL + { + public IDbConnection Connection { get; } + + public CustomerDAL(IDbConnection connection) + { + Connection = connection; + } + + public void InsertCustomers(IEnumerable customers) + { + string insertSql = "INSERT INTO CUSTOMERS(CUSTOMERID,NAME,ADDRESS,POSTALCODE,CITY) VALUES(:CUSTOMERID,:NAME,:POSTALCODE,:CITY)"; + + var mapping = new BulkMapping[] + { + new BulkMapping("CUSTOMERID",c=>c.CustomerId), + new BulkMapping("NAME",c=>c.Name), + new BulkMapping("ADDRESS",c=>c.Address), + new BulkMapping("POSTALCODE",c=>c.PostalCode), + new BulkMapping("CITY",c=>c.City), + }; + + Connection.SqlBulk(insertSql, customers, mapping); + } + } +``` \ No newline at end of file diff --git a/releasenotes.md b/releasenotes.md index 4c640e4..fba1440 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -1,5 +1,10 @@ # Releasenotes +## 1.2.1 +- Fixed bug in type converter +- Added doc for Type handlers +- New feature: Bulk Sql, se doc/BulkSql.md for details. + ## 1.2.0 - New buildsystem, now using Cakebuild instead of psake. - Cleanup of file tree. diff --git a/src/Dapper.Oracle/BulkSql/BulkMapping.cs b/src/Dapper.Oracle/BulkSql/BulkMapping.cs new file mode 100644 index 0000000..5a4d267 --- /dev/null +++ b/src/Dapper.Oracle/BulkSql/BulkMapping.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Text; + +namespace Dapper.Oracle.BulkSql +{ + /// + /// Contains mapping between a property on T and a database query parameter + /// + /// Entity type for mapping + public class BulkMapping + { + public string Name { get; set; } + + public Func Property { get; set; } + + public ParameterDirection ParameterDirection { get; set; } + + public OracleMappingType? DbType { get; set; } + + public int? Size { get; set; } + + public bool? IsNullable { get; set; } + + public byte? Precision { get; set; } + + public byte? Scale { get; set; } + + public string SourceColumn { get; set; } = string.Empty; + + public DataRowVersion SourceVersion { get; set; } + + public OracleMappingCollectionType CollectionType { get; set; } = OracleMappingCollectionType.None; + + public int[] ArrayBindSize { get; set; } + + /// + /// Creates an instance of parametermapping to be used in bulk operations + /// + /// Name. Must match the named parameter in the sql statement or stored procedure + /// Selectorfunc for querying an IEnumerable of T for a specific property + /// Oracle database type + /// Parameter direction. Defaults to Input + /// + /// + /// + /// + /// + /// + /// + /// + public BulkMapping(string name, + Func property, + OracleMappingType? dbType = null, + ParameterDirection? direction = null, + int? size = null, + bool? isNullable = null, + byte? precision = null, + byte? scale = null, + string sourceColumn = null, + DataRowVersion? sourceVersion = null, + OracleMappingCollectionType? collectionType = null, + int[] arrayBindSize = null) + { + Name = name; + Property = property; + ParameterDirection = direction ?? ParameterDirection.Input; + DbType = dbType; + Size = size; + IsNullable = isNullable ?? false; + Precision = precision; + Scale = scale; + SourceColumn = sourceColumn; + SourceVersion = sourceVersion ?? DataRowVersion.Current; + CollectionType = collectionType ?? OracleMappingCollectionType.None; + ArrayBindSize = arrayBindSize; + } + } +} diff --git a/src/Dapper.Oracle/BulkSql/BulkOperation.cs b/src/Dapper.Oracle/BulkSql/BulkOperation.cs new file mode 100644 index 0000000..5ff21c0 --- /dev/null +++ b/src/Dapper.Oracle/BulkSql/BulkOperation.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Threading.Tasks; + +namespace Dapper.Oracle.BulkSql +{ + public static class BulkOperation + { + + /// + /// Executes a bulk SQL statement against database and returns the number of rows affected + /// Works with UPDATE / INSERT / DELETE statements, and stored procedures. + /// + /// Entity type for the bulk operation object + /// The Database connection to use + /// Sql statement to execute. + /// + /// Parameter names MUST MATCH property names in object entity. + /// + /// IEnumerable containing object for bulk operation + /// Command type;Text or StoredProcedure + /// IDBtransaction to use + /// Number of rows affected by bulk statement + public static int SqlBulk(this IDbConnection connection, string sql, IEnumerable objects, + IEnumerable> mapping, IDbTransaction transaction = null, CommandType? cmdType = CommandType.Text) + { + return SqlBulk(connection, sql, objects, mapping, out _, cmdType, transaction); + } + + + /// + /// Executes a bulk SQL statement against database and returns the number of rows affected + /// Works with UPDATE / INSERT / DELETE statements, and stored procedures. + /// + /// Entity type for the bulk operation object + /// The Database connection to use + /// Sql statement to execute. + /// + /// Parameter names MUST MATCH property names in object entity. + /// + /// IEnumerable containing object for bulk operation + /// Instance of used for executing sql statements. Can be used to retreive value from a refcursor + /// Command type;Text or StoredProcedure + /// IDBtransaction to use + /// Number of rows affected by bulk statement + public static int SqlBulk(this IDbConnection connection, string sql, IEnumerable objects, + IEnumerable> mapping, out OracleDynamicParameters parameters, + CommandType? cmdType = CommandType.Text, IDbTransaction transaction = null) + { + parameters = CreateParameterFromObject(objects, mapping); + return connection.Execute(sql, parameters, commandType: cmdType); + } + + public static async Task SqlBulkAsync(this IDbConnection connection, string sql, IEnumerable objects, IEnumerable> mapping, CommandType? cmdType = CommandType.Text, IDbTransaction transaction=null) + { + var parameters = CreateParameterFromObject(objects, mapping); + var result = await connection.ExecuteAsync(sql, parameters,transaction, commandType:cmdType); + return new AsyncQueryResult + { + ExecuteResult = result, + Parameters = parameters + }; + } + + private static OracleDynamicParameters CreateParameterFromObject(IEnumerable objects, + IEnumerable> mapping) + { + var parameters = new OracleDynamicParameters(); + var obj = objects.ToList(); + parameters.ArrayBindCount = obj.Count; + parameters.BindByName = true; + foreach (var map in mapping) + { + var values = map.Property != null ? obj.Select(map.Property).ToArray() : null; + var dbType = map.DbType ?? OracleMapper.GuessType(obj.First().GetType()); + + parameters.Add( + Clean(map.Name), + values, + dbType, + map.ParameterDirection, + map.Size, + map.IsNullable, + map.Precision, + map.Scale, + map.SourceColumn, + map.SourceVersion, + map.CollectionType, + map.ArrayBindSize); + } + + return parameters; + } + + private static string Clean(string name) + { + if (name.StartsWith("@") || name.StartsWith(":")) + { + return name.Substring(1); + } + + return name; + } + } + + public class AsyncQueryResult + { + /// + /// Return value from Execute statement, returns the number of rows affected. + /// + public int ExecuteResult { get; set; } + + /// + /// Returns the Dynamic parameters used in query. + /// + public OracleDynamicParameters Parameters { get; set; } + } +} \ No newline at end of file diff --git a/src/Dapper.Oracle/BulkSql/OracleMapper.cs b/src/Dapper.Oracle/BulkSql/OracleMapper.cs new file mode 100644 index 0000000..7e3e73a --- /dev/null +++ b/src/Dapper.Oracle/BulkSql/OracleMapper.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Dapper.Oracle.BulkSql +{ + internal static class OracleMapper + { + private static Dictionary OracleMappings = new Dictionary + { + {typeof(Guid), OracleMappingType.Raw}, + {typeof(string), OracleMappingType.Varchar2}, + {typeof(long), OracleMappingType.Long}, + {typeof(decimal), OracleMappingType.Decimal}, + {typeof(DateTime), OracleMappingType.Date}, + {typeof(int), OracleMappingType.Int32}, + {typeof(bool),OracleMappingType.Int16 } + }; + + public static OracleMappingType? GuessType(Type type) + { + if (OracleMappings.ContainsKey(type)) + { + return OracleMappings[type]; + } + + return null; + } + + public static OracleDynamicParameters Create(IEnumerable objects) + { + var type = typeof(T); + var entities = objects.ToList(); + + var odp = new OracleDynamicParameters(); + odp.ArrayBindCount = entities.Count; + odp.BindByName = true; + + + foreach (var pi in type.GetProperties()) + { + if (pi.CanRead) + { + var parameterName = pi.Name; + OracleMappingType? dbType = null; + + Func selector; + if (OracleMappings.ContainsKey(pi.PropertyType)) + { + dbType = OracleMappings[pi.PropertyType]; + } + + if (pi.PropertyType == typeof(Guid)) + { + selector = p => ((Guid)pi.GetValue(p)).ToByteArray(); + } + else if (pi.PropertyType == typeof(bool)) + { + selector = p => ((bool)pi.GetValue(p)) ? 1 : 0; + } + else + { + selector = p => pi.GetValue(p); + } + + var values = entities.Select(selector).ToArray(); + odp.Add(parameterName, values, dbType); + } + } + + return odp; + } + } +} diff --git a/src/Dapper.Oracle/Dapper.Oracle.csproj b/src/Dapper.Oracle/Dapper.Oracle.csproj index fc1d892..c8944b0 100644 --- a/src/Dapper.Oracle/Dapper.Oracle.csproj +++ b/src/Dapper.Oracle/Dapper.Oracle.csproj @@ -1,21 +1,21 @@  - + false netstandard2.0;net452 - - - - - + + + + + - + v4.5.2 diff --git a/src/Dapper.Oracle/OracleMappingType.cs b/src/Dapper.Oracle/OracleMappingType.cs index fdb9133..03415bc 100644 --- a/src/Dapper.Oracle/OracleMappingType.cs +++ b/src/Dapper.Oracle/OracleMappingType.cs @@ -37,7 +37,7 @@ public enum OracleMappingType } /// - /// Mapping enum to map Collection type for parameter when using PL/Sql associative arrays without referencing oracle directly. + /// BulkMapping enum to map Collection type for parameter when using PL/Sql associative arrays without referencing oracle directly. /// public enum OracleMappingCollectionType { @@ -46,7 +46,7 @@ public enum OracleMappingCollectionType } /// - /// Mapping enum to map Parameter status for OracleParameter + /// BulkMapping enum to map Parameter status for OracleParameter /// public enum OracleParameterMappingStatus { diff --git a/src/Dapper.Oracle/OracleValueConverter.cs b/src/Dapper.Oracle/OracleValueConverter.cs index b71ff86..c691695 100644 --- a/src/Dapper.Oracle/OracleValueConverter.cs +++ b/src/Dapper.Oracle/OracleValueConverter.cs @@ -58,7 +58,7 @@ public static T Convert(object val) } // If not isNull, continue and get the Value } - + var valueProperty = valueType.GetProperty("Value"); if (valueProperty != null && valueProperty.CanRead) { @@ -67,7 +67,7 @@ public static T Convert(object val) } } - return (T)val; + return (T)System.Convert.ChangeType(val, typeof(T)); } } } diff --git a/src/Dapper.Oracle/TypeHandler/BooleanStringTypeHandler.cs b/src/Dapper.Oracle/TypeHandler/BooleanStringTypeHandler.cs index 372aee9..aa46e9d 100644 --- a/src/Dapper.Oracle/TypeHandler/BooleanStringTypeHandler.cs +++ b/src/Dapper.Oracle/TypeHandler/BooleanStringTypeHandler.cs @@ -15,8 +15,8 @@ public class BooleanStringTypeHandler : TypeHandlerBase /// /// Creates an instance of this class /// - /// Mapping value to use in database for a boolean true value - /// Mapping value to use in database for a boolean false value + /// BulkMapping value to use in database for a boolean true value + /// BulkMapping value to use in database for a boolean false value public BooleanStringTypeHandler(string trueValue, string falseValue,StringComparison comparison = StringComparison.Ordinal) { trueString = trueValue; diff --git a/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/BulkOperationTests.cs b/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/BulkOperationTests.cs new file mode 100644 index 0000000..19c063f --- /dev/null +++ b/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/BulkOperationTests.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; +using Dapper; +using Dapper.Oracle; +using Dapper.Oracle.BulkSql; +using FluentAssertions; +using Newtonsoft.Json; +using Tests.Dapper.Oracle.IntegrationTests.Util; +using Xunit; + +namespace Tests.Dapper.Oracle.IntegrationTests.BulkSql +{ + [Collection("OracleDocker")] + public class BulkOperationTests + { + const string InsertSql = "Insert into BULKCUSTOMERS (CUSTOMERID,COMPANYNAME,CITY,CONTACTNAME,CONTACTTITLE,ADDRESS,POSTALCODE,COUNTRY,PHONE,FAX,TIDSSTEMPEL,OPPRETTETAV,OPPRETTETTID,SISTENDRETAV,SISTENDRETTID,DIPSID) " + + "values (:CUSTOMERID,:COMPANYNAME,:CITY,:CONTACTNAME,:CONTACTTITLE,:ADDRESS,:POSTALCODE,:COUNTRY,:PHONE,:FAX,:TIDSSTEMPEL,:OPPRETTETAV,:OPPRETTETTID,:SISTENDRETAV,:SISTENDRETTID,:DIPSID)"; + + private DatabaseFixture Fixture { get; } + + public BulkOperationTests(DatabaseFixture fixture) + { + Fixture = fixture; + + var columns = new[] + { + new TableColumn {Name = "CUSTOMERID", DataType = OracleMappingType.Raw, Size = 16, PrimaryKey = true}, + new TableColumn {Name = "COMPANYNAME", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "CITY", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "CONTACTNAME", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "CONTACTTITLE", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "ADDRESS", DataType = OracleMappingType.Varchar2, Size = 60}, + new TableColumn {Name = "POSTALCODE", DataType = OracleMappingType.Varchar2, Size = 40, Nullable=true}, + new TableColumn {Name = "COUNTRY", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "PHONE", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "FAX", DataType = OracleMappingType.Varchar2, Size = 40, Nullable=true}, + new NumberColumn {Name = "TIDSSTEMPEL", DataType = OracleMappingType.Int64}, + new TableColumn {Name = "OPPRETTETAV", DataType = OracleMappingType.Varchar2, Size = 40}, + new TableColumn {Name = "OPPRETTETTID", DataType = OracleMappingType.Date}, + new TableColumn {Name = "SISTENDRETAV", DataType = OracleMappingType.Varchar2, Size=40}, + new TableColumn {Name = "SISTENDRETTID", DataType = OracleMappingType.Date}, + new NumberColumn {Name = "DIPSID", DataType = OracleMappingType.Int64}, + }; + + TableCreator.Create(Fixture.Connection, "BULKCUSTOMERS", columns); + } + + [Fact, Trait("Category", "IntegrationTest")] + public void BulkSql() + { + var customers = GetCustomersFromEmbeddedResource(); + foreach (var customer in customers) + { + customer.CustomerId = Guid.NewGuid(); + } + var customerCount = customers.Count; + int result = -1; + + result = Fixture.Connection.SqlBulk(InsertSql, customers, CreateMapping()); + result.Should().Be(customerCount); + } + + [Fact, Trait("Category", "IntegrationTest")] + public async Task BulkSqlAsync() + { + var customers = GetCustomersFromEmbeddedResource(); + foreach (var customer in customers) + { + customer.CustomerId = Guid.NewGuid(); + } + + var customerCount = customers.Count; + + var asyncQueryResult = await Fixture.Connection.SqlBulkAsync(InsertSql, customers, CreateMapping()); + asyncQueryResult.ExecuteResult.Should().Be(customerCount); + asyncQueryResult.Parameters.Should().NotBeNull(); + } + + IEnumerable> CreateMapping() + { + yield return new BulkMapping("CUSTOMERID", c => c.CustomerId.ToByteArray(), OracleMappingType.Raw); + yield return new BulkMapping("COMPANYNAME", c => c.CompanyName, OracleMappingType.Varchar2); + yield return new BulkMapping("CITY", c => c.City, OracleMappingType.Varchar2); + yield return new BulkMapping("CONTACTNAME", c => c.ContactName, OracleMappingType.Varchar2); + yield return new BulkMapping("CONTACTTITLE", c => c.ContactTitle, OracleMappingType.Varchar2); + yield return new BulkMapping("ADDRESS", c => c.Address, OracleMappingType.Varchar2); + yield return new BulkMapping("POSTALCODE", c => c.PostalCode, OracleMappingType.Varchar2); + yield return new BulkMapping("COUNTRY", c => c.Country, OracleMappingType.Varchar2); + yield return new BulkMapping("PHONE", c => c.Phone, OracleMappingType.Varchar2); + yield return new BulkMapping("FAX", c => c.Fax, OracleMappingType.Varchar2); + yield return new BulkMapping("TIDSSTEMPEL", c => c.TidsStempel, OracleMappingType.Int64); + yield return new BulkMapping("OPPRETTETAV", c => c.OpprettetAv, OracleMappingType.Varchar2); + yield return new BulkMapping("OPPRETTETTID", c => c.OpprettetTid, OracleMappingType.Date); + yield return new BulkMapping("SISTENDRETAV", c => c.SistEndretAv, OracleMappingType.Varchar2); + yield return new BulkMapping("SISTENDRETTID", c => c.SistEndretTid, OracleMappingType.Date); + yield return new BulkMapping("DIPSID", c => c.DipsId, OracleMappingType.Int64); + } + + + private List GetCustomersFromEmbeddedResource() + { + using (Stream s = this.GetType().Assembly.GetManifestResourceStream("Tests.Dapper.Oracle.IntegrationTests.BulkSql.customers.json")) + { + using (StreamReader sr = new StreamReader(s)) + { + string json = sr.ReadToEnd(); + return JsonConvert.DeserializeObject>(json).ToList(); + } + } + } + } + + public class CustomerDAL + { + public IDbConnection Connection { get; } + + public CustomerDAL(IDbConnection connection) + { + Connection = connection; + } + + public void InsertCustomers(IEnumerable customers) + { + string insertSql = "INSERT INTO CUSTOMERS(CUSTOMERID,NAME,ADDRESS,POSTALCODE,CITY) VALUES(:CUSTOMERID,:NAME,:POSTALCODE,:CITY)"; + + var mapping = new BulkMapping[] + { + new BulkMapping("CUSTOMERID",c=>c.CustomerId), + new BulkMapping("NAME",c=>c.ContactName), + new BulkMapping("ADDRESS",c=>c.Address), + new BulkMapping("POSTALCODE",c=>c.PostalCode), + new BulkMapping("CITY",c=>c.City), + }; + + + Connection.SqlBulk(insertSql, customers, mapping); + + } + } +} diff --git a/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/Customer.cs b/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/Customer.cs new file mode 100644 index 0000000..442788d --- /dev/null +++ b/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/Customer.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tests.Dapper.Oracle.IntegrationTests.BulkSql +{ + public class Customer + { + public Guid CustomerId { get; set; } + public string CompanyName { get; set; } + + public string City { get; set; } + public string ContactName { get; set; } + public string ContactTitle { get; set; } + public string Address { get; set; } + public string PostalCode { get; set; } + public string Country { get; set; } + public string Phone { get; set; } + public string Fax { get; set; } + public long TidsStempel { get; set; } + public string OpprettetAv { get; set; } + public DateTime OpprettetTid { get; set; } + public string SistEndretAv { get; set; } + public DateTime SistEndretTid { get; set; } + + public long DipsId { get; set; } + + } +} diff --git a/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/customers.json b/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/customers.json new file mode 100644 index 0000000..2c72ce9 --- /dev/null +++ b/src/Tests.Dapper.Oracle/IntegrationTests/BulkSql/customers.json @@ -0,0 +1,1640 @@ +[ + { + "CustomerId": "24311ccf-dae3-e7d4-e040-000a0e654788", + "CompanyName": "Alfreds Futterkiste", + "City": "Berlin", + "ContactName": "Maria Anders", + "ContactTitle": "Sales Representative", + "Address": "Obere Str. 57", + "PostalCode": "12209", + "Country": "Germany", + "Phone": "030-0074321", + "Fax": "030-0076545", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 1 + }, + { + "CustomerId": "24311ccf-dbe3-e7d4-e040-000a0e654788", + "CompanyName": "Ana Trujillo Emparedados y helados", + "City": "México D.F.", + "ContactName": "Ana Trujillo", + "ContactTitle": "Owner", + "Address": "Avda. de la Constitución 2222", + "PostalCode": "05021", + "Country": "Mexico", + "Phone": "(5) 555-4729", + "Fax": "(5) 555-3745", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 2 + }, + { + "CustomerId": "24311ccf-dce3-e7d4-e040-000a0e654788", + "CompanyName": "Antonio Moreno Taquería", + "City": "México D.F.", + "ContactName": "Antonio Moreno", + "ContactTitle": "Owner", + "Address": "Mataderos 2312", + "PostalCode": "05023", + "Country": "Mexico", + "Phone": "(5) 555-3932", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 3 + }, + { + "CustomerId": "24311ccf-dde3-e7d4-e040-000a0e654788", + "CompanyName": "Around the Horn", + "City": "London", + "ContactName": "Thomas Hardy", + "ContactTitle": "Sales Representative", + "Address": "120 Hanover Sq.", + "PostalCode": "WA1 1DP", + "Country": "UK", + "Phone": "(171) 555-7788", + "Fax": "(171) 555-6750", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 4 + }, + { + "CustomerId": "24311ccf-dee3-e7d4-e040-000a0e654788", + "CompanyName": "Berglunds snabbköp", + "City": "Luleå", + "ContactName": "Christina Berglund", + "ContactTitle": "Order Administrator", + "Address": "Berguvsvägen 8", + "PostalCode": "S-958 22", + "Country": "Sweden", + "Phone": "0921-12 34 65", + "Fax": "0921-12 34 67", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 5 + }, + { + "CustomerId": "24311ccf-dfe3-e7d4-e040-000a0e654788", + "CompanyName": "Blauer See Delikatessen", + "City": "Mannheim", + "ContactName": "Hanna Moos", + "ContactTitle": "Sales Representative", + "Address": "Forsterstr. 57", + "PostalCode": "68306", + "Country": "Germany", + "Phone": "0621-08460", + "Fax": "0621-08924", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 6 + }, + { + "CustomerId": "24311ccf-e0e3-e7d4-e040-000a0e654788", + "CompanyName": "Blondesddsl père et fils", + "City": "Strasbourg", + "ContactName": "Frédérique Citeaux", + "ContactTitle": "Marketing Manager", + "Address": "24, place Kléber", + "PostalCode": "67000", + "Country": "France", + "Phone": "88.60.15.31", + "Fax": "88.60.15.32", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 7 + }, + { + "CustomerId": "24311ccf-e1e3-e7d4-e040-000a0e654788", + "CompanyName": "Bólido Comidas preparadas", + "City": "Madrid", + "ContactName": "Martín Sommer", + "ContactTitle": "Owner", + "Address": "C/ Araquil, 67", + "PostalCode": "28023", + "Country": "Spain", + "Phone": "(91) 555 22 82", + "Fax": "(91) 555 91 99", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 8 + }, + { + "CustomerId": "24311ccf-e2e3-e7d4-e040-000a0e654788", + "CompanyName": "Bon app'", + "City": "Marseille", + "ContactName": "Laurence Lebihan", + "ContactTitle": "Owner", + "Address": "12, rue des Bouchers", + "PostalCode": "13008", + "Country": "France", + "Phone": "91.24.45.40", + "Fax": "91.24.45.41", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 9 + }, + { + "CustomerId": "24311ccf-e3e3-e7d4-e040-000a0e654788", + "CompanyName": "Bottom-Dollar Markets", + "City": "Tsawassen", + "ContactName": "Elizabeth Lincoln", + "ContactTitle": "Accounting Manager", + "Address": "23 Tsawassen Blvd.", + "PostalCode": "T2F 8M4", + "Country": "Canada", + "Phone": "(604) 555-4729", + "Fax": "(604) 555-3745", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 10 + }, + { + "CustomerId": "24311ccf-e4e3-e7d4-e040-000a0e654788", + "CompanyName": "B's Beverages", + "City": "London", + "ContactName": "Victoria Ashworth", + "ContactTitle": "Sales Representative", + "Address": "Fauntleroy Circus", + "PostalCode": "EC2 5NT", + "Country": "UK", + "Phone": "(171) 555-1212", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 11 + }, + { + "CustomerId": "24311ccf-e5e3-e7d4-e040-000a0e654788", + "CompanyName": "Cactus Comidas para llevar", + "City": "Buenos Aires", + "ContactName": "Patricio Simpson", + "ContactTitle": "Sales Agent", + "Address": "Cerrito 333", + "PostalCode": "1010", + "Country": "Argentina", + "Phone": "(1) 135-5555", + "Fax": "(1) 135-4892", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 12 + }, + { + "CustomerId": "24311ccf-e6e3-e7d4-e040-000a0e654788", + "CompanyName": "Centro comercial Moctezuma", + "City": "México D.F.", + "ContactName": "Francisco Chang", + "ContactTitle": "Marketing Manager", + "Address": "Sierras de Granada 9993", + "PostalCode": "05022", + "Country": "Mexico", + "Phone": "(5) 555-3392", + "Fax": "(5) 555-7293", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 13 + }, + { + "CustomerId": "24311ccf-e7e3-e7d4-e040-000a0e654788", + "CompanyName": "Chop-suey Chinese", + "City": "Bern", + "ContactName": "Yang Wang", + "ContactTitle": "Owner", + "Address": "Hauptstr. 29", + "PostalCode": "3012", + "Country": "Switzerland", + "Phone": "0452-076545", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 14 + }, + { + "CustomerId": "24311ccf-e8e3-e7d4-e040-000a0e654788", + "CompanyName": "Comércio Mineiro", + "City": "Sao Paulo", + "ContactName": "Pedro Afonso", + "ContactTitle": "Sales Associate", + "Address": "Av. dos Lusíadas, 23", + "PostalCode": "05432-043", + "Country": "Brazil", + "Phone": "(11) 555-7647", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 15 + }, + { + "CustomerId": "24311ccf-e9e3-e7d4-e040-000a0e654788", + "CompanyName": "Consolidated Holdings", + "City": "London", + "ContactName": "Elizabeth Brown", + "ContactTitle": "Sales Representative", + "Address": "Berkeley Gardens 12 Brewery", + "PostalCode": "WX1 6LT", + "Country": "UK", + "Phone": "(171) 555-2282", + "Fax": "(171) 555-9199", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 16 + }, + { + "CustomerId": "24311ccf-eae3-e7d4-e040-000a0e654788", + "CompanyName": "Drachenblut Delikatessen", + "City": "Aachen", + "ContactName": "Sven Ottlieb", + "ContactTitle": "Order Administrator", + "Address": "Walserweg 21", + "PostalCode": "52066", + "Country": "Germany", + "Phone": "0241-039123", + "Fax": "0241-059428", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 17 + }, + { + "CustomerId": "24311ccf-ebe3-e7d4-e040-000a0e654788", + "CompanyName": "Du monde entier", + "City": "Nantes", + "ContactName": "Janine Labrune", + "ContactTitle": "Owner", + "Address": "67, rue des Cinquante Otages", + "PostalCode": "44000", + "Country": "France", + "Phone": "40.67.88.88", + "Fax": "40.67.89.89", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 18 + }, + { + "CustomerId": "24311ccf-ece3-e7d4-e040-000a0e654788", + "CompanyName": "Eastern Connection", + "City": "London", + "ContactName": "Ann Devon", + "ContactTitle": "Sales Agent", + "Address": "35 King George", + "PostalCode": "WX3 6FW", + "Country": "UK", + "Phone": "(171) 555-0297", + "Fax": "(171) 555-3373", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 19 + }, + { + "CustomerId": "24311ccf-ede3-e7d4-e040-000a0e654788", + "CompanyName": "Ernst Handel", + "City": "Graz", + "ContactName": "Roland Mendel", + "ContactTitle": "Sales Manager", + "Address": "Kirchgasse 6", + "PostalCode": "8010", + "Country": "Austria", + "Phone": "7675-3425", + "Fax": "7675-3426", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 20 + }, + { + "CustomerId": "24311ccf-eee3-e7d4-e040-000a0e654788", + "CompanyName": "Familia Arquibaldo", + "City": "Sao Paulo", + "ContactName": "Aria Cruz", + "ContactTitle": "Marketing Assistant", + "Address": "Rua Orós, 92", + "PostalCode": "05442-030", + "Country": "Brazil", + "Phone": "(11) 555-9857", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 21 + }, + { + "CustomerId": "24311ccf-efe3-e7d4-e040-000a0e654788", + "CompanyName": "FISSA Fabrica Inter. Salchichas S.A.", + "City": "Madrid", + "ContactName": "Diego Roel", + "ContactTitle": "Accounting Manager", + "Address": "C/ Moralzarzal, 86", + "PostalCode": "28034", + "Country": "Spain", + "Phone": "(91) 555 94 44", + "Fax": "(91) 555 55 93", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 22 + }, + { + "CustomerId": "24311ccf-f0e3-e7d4-e040-000a0e654788", + "CompanyName": "Folies gourmandes", + "City": "Lille", + "ContactName": "Martine Rancé", + "ContactTitle": "Assistant Sales Agent", + "Address": "184, chaussée de Tournai", + "PostalCode": "59000", + "Country": "France", + "Phone": "20.16.10.16", + "Fax": "20.16.10.17", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 23 + }, + { + "CustomerId": "24311ccf-f1e3-e7d4-e040-000a0e654788", + "CompanyName": "Folk och fä HB", + "City": "Bräcke", + "ContactName": "Maria Larsson", + "ContactTitle": "Owner", + "Address": "Åkergatan 24", + "PostalCode": "S-844 67", + "Country": "Sweden", + "Phone": "0695-34 67 21", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 24 + }, + { + "CustomerId": "24311ccf-f2e3-e7d4-e040-000a0e654788", + "CompanyName": "Frankenversand", + "City": "München", + "ContactName": "Peter Franken", + "ContactTitle": "Marketing Manager", + "Address": "Berliner Platz 43", + "PostalCode": "80805", + "Country": "Germany", + "Phone": "089-0877310", + "Fax": "089-0877451", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 25 + }, + { + "CustomerId": "24311ccf-f3e3-e7d4-e040-000a0e654788", + "CompanyName": "France restauration", + "City": "Nantes", + "ContactName": "Carine Schmitt", + "ContactTitle": "Marketing Manager", + "Address": "54, rue Royale", + "PostalCode": "44000", + "Country": "France", + "Phone": "40.32.21.21", + "Fax": "40.32.21.20", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 26 + }, + { + "CustomerId": "24311ccf-f4e3-e7d4-e040-000a0e654788", + "CompanyName": "Franchi S.p.A.", + "City": "Torino", + "ContactName": "Paolo Accorti", + "ContactTitle": "Sales Representative", + "Address": "Via Monte Bianco 34", + "PostalCode": "10100", + "Country": "Italy", + "Phone": "011-4988260", + "Fax": "011-4988261", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 27 + }, + { + "CustomerId": "24311ccf-f5e3-e7d4-e040-000a0e654788", + "CompanyName": "Furia Bacalhau e Frutos do Mar", + "City": "Lisboa", + "ContactName": "Lino Rodriguez", + "ContactTitle": "Sales Manager", + "Address": "Jardim das rosas n. 32", + "PostalCode": "1675", + "Country": "Portugal", + "Phone": "(1) 354-2534", + "Fax": "(1) 354-2535", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 28 + }, + { + "CustomerId": "24311ccf-f6e3-e7d4-e040-000a0e654788", + "CompanyName": "Galería del gastrónomo", + "City": "Barcelona", + "ContactName": "Eduardo Saavedra", + "ContactTitle": "Marketing Manager", + "Address": "Rambla de Cataluña, 23", + "PostalCode": "08022", + "Country": "Spain", + "Phone": "(93) 203 4560", + "Fax": "(93) 203 4561", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 29 + }, + { + "CustomerId": "24311ccf-f7e3-e7d4-e040-000a0e654788", + "CompanyName": "Godos Cocina Típica", + "City": "Sevilla", + "ContactName": "José Pedro Freyre", + "ContactTitle": "Sales Manager", + "Address": "C/ Romero, 33", + "PostalCode": "41101", + "Country": "Spain", + "Phone": "(95) 555 82 82", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 30 + }, + { + "CustomerId": "24311ccf-f8e3-e7d4-e040-000a0e654788", + "CompanyName": "Gourmet Lanchonetes", + "City": "Campinas", + "ContactName": "André Fonseca", + "ContactTitle": "Sales Associate", + "Address": "Av. Brasil, 442", + "PostalCode": "04876-786", + "Country": "Brazil", + "Phone": "(11) 555-9482", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 31 + }, + { + "CustomerId": "24311ccf-f9e3-e7d4-e040-000a0e654788", + "CompanyName": "Great Lakes Food Market", + "City": "Eugene", + "ContactName": "Howard Snyder", + "ContactTitle": "Marketing Manager", + "Address": "2732 Baker Blvd.", + "PostalCode": "97403", + "Country": "USA", + "Phone": "(503) 555-7555", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 32 + }, + { + "CustomerId": "24311ccf-fae3-e7d4-e040-000a0e654788", + "CompanyName": "GROSELLA-Restaurante", + "City": "Caracas", + "ContactName": "Manuel Pereira", + "ContactTitle": "Owner", + "Address": "5ª Ave. Los Palos Grandes", + "PostalCode": "1081", + "Country": "Venezuela", + "Phone": "(2) 283-2951", + "Fax": "(2) 283-3397", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 33 + }, + { + "CustomerId": "24311ccf-fbe3-e7d4-e040-000a0e654788", + "CompanyName": "Hanari Carnes", + "City": "Rio de Janeiro", + "ContactName": "Mario Pontes", + "ContactTitle": "Accounting Manager", + "Address": "Rua do Paço, 67", + "PostalCode": "05454-876", + "Country": "Brazil", + "Phone": "(21) 555-0091", + "Fax": "(21) 555-8765", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 34 + }, + { + "CustomerId": "24311ccf-fce3-e7d4-e040-000a0e654788", + "CompanyName": "HILARION-Abastos", + "City": "San Cristóbal", + "ContactName": "Carlos Hernández", + "ContactTitle": "Sales Representative", + "Address": "Carrera 22 con Ave. Carlos Soublette #8-35", + "PostalCode": "5022", + "Country": "Venezuela", + "Phone": "(5) 555-1340", + "Fax": "(5) 555-1948", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 35 + }, + { + "CustomerId": "24311ccf-fde3-e7d4-e040-000a0e654788", + "CompanyName": "Hungry Coyote Import Store", + "City": "Elgin", + "ContactName": "Yoshi Latimer", + "ContactTitle": "Sales Representative", + "Address": "City Center Plaza 516 Main St.", + "PostalCode": "97827", + "Country": "USA", + "Phone": "(503) 555-6874", + "Fax": "(503) 555-2376", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 36 + }, + { + "CustomerId": "24311ccf-fee3-e7d4-e040-000a0e654788", + "CompanyName": "Hungry Owl All-Night Grocers", + "City": "Cork", + "ContactName": "Patricia McKenna", + "ContactTitle": "Sales Associate", + "Address": "8 Johnstown Road", + "PostalCode": null, + "Country": "Ireland", + "Phone": "2967 542", + "Fax": "2967 3333", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 37 + }, + { + "CustomerId": "24311ccf-ffe3-e7d4-e040-000a0e654788", + "CompanyName": "Island Trading", + "City": "Cowes", + "ContactName": "Helen Bennett", + "ContactTitle": "Marketing Manager", + "Address": "Garden House Crowther Way", + "PostalCode": "PO31 7PJ", + "Country": "UK", + "Phone": "(198) 555-8888", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 38 + }, + { + "CustomerId": "24311ccf-00e4-e7d4-e040-000a0e654788", + "CompanyName": "Königlich Essen", + "City": "Brandenburg", + "ContactName": "Philip Cramer", + "ContactTitle": "Sales Associate", + "Address": "Maubelstr. 90", + "PostalCode": "14776", + "Country": "Germany", + "Phone": "0555-09876", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 39 + }, + { + "CustomerId": "24311ccf-01e4-e7d4-e040-000a0e654788", + "CompanyName": "La corne d'abondance", + "City": "Versailles", + "ContactName": "Daniel Tonini", + "ContactTitle": "Sales Representative", + "Address": "67, avenue de l'Europe", + "PostalCode": "78000", + "Country": "France", + "Phone": "30.59.84.10", + "Fax": "30.59.85.11", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 40 + }, + { + "CustomerId": "24311ccf-02e4-e7d4-e040-000a0e654788", + "CompanyName": "La maison d'Asie", + "City": "Toulouse", + "ContactName": "Annette Roulet", + "ContactTitle": "Sales Manager", + "Address": "1 rue Alsace-Lorraine", + "PostalCode": "31000", + "Country": "France", + "Phone": "61.77.61.10", + "Fax": "61.77.61.11", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 41 + }, + { + "CustomerId": "24311ccf-03e4-e7d4-e040-000a0e654788", + "CompanyName": "Laughing Bacchus Wine Cellars", + "City": "Vancouver", + "ContactName": "Yoshi Tannamuri", + "ContactTitle": "Marketing Assistant", + "Address": "1900 Oak St.", + "PostalCode": "V3F 2K1", + "Country": "Canada", + "Phone": "(604) 555-3392", + "Fax": "(604) 555-7293", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 42 + }, + { + "CustomerId": "24311ccf-04e4-e7d4-e040-000a0e654788", + "CompanyName": "Lazy K Kountry Store", + "City": "Walla Walla", + "ContactName": "John Steel", + "ContactTitle": "Marketing Manager", + "Address": "12 Orchestra Terrace", + "PostalCode": "99362", + "Country": "USA", + "Phone": "(509) 555-7969", + "Fax": "(509) 555-6221", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 43 + }, + { + "CustomerId": "24311ccf-05e4-e7d4-e040-000a0e654788", + "CompanyName": "Lehmanns Marktstand", + "City": "Frankfurt a.M.", + "ContactName": "Renate Messner", + "ContactTitle": "Sales Representative", + "Address": "Magazinweg 7", + "PostalCode": "60528", + "Country": "Germany", + "Phone": "069-0245984", + "Fax": "069-0245874", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 44 + }, + { + "CustomerId": "24311ccf-06e4-e7d4-e040-000a0e654788", + "CompanyName": "Let's Stop N Shop", + "City": "San Francisco", + "ContactName": "Jaime Yorres", + "ContactTitle": "Owner", + "Address": "87 Polk St. Suite 5", + "PostalCode": "94117", + "Country": "USA", + "Phone": "(415) 555-5938", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 45 + }, + { + "CustomerId": "24311ccf-07e4-e7d4-e040-000a0e654788", + "CompanyName": "LILA-Supermercado", + "City": "Barquisimeto", + "ContactName": "Carlos González", + "ContactTitle": "Accounting Manager", + "Address": "Carrera 52 con Ave. Bolívar #65-98 Llano Largo", + "PostalCode": "3508", + "Country": "Venezuela", + "Phone": "(9) 331-6954", + "Fax": "(9) 331-7256", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 46 + }, + { + "CustomerId": "24311ccf-08e4-e7d4-e040-000a0e654788", + "CompanyName": "LINO-Delicateses", + "City": "I. de Margarita", + "ContactName": "Felipe Izquierdo", + "ContactTitle": "Owner", + "Address": "Ave. 5 de Mayo Porlamar", + "PostalCode": "4980", + "Country": "Venezuela", + "Phone": "(8) 34-56-12", + "Fax": "(8) 34-93-93", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 47 + }, + { + "CustomerId": "24311ccf-09e4-e7d4-e040-000a0e654788", + "CompanyName": "Lonesome Pine Restaurant", + "City": "Portland", + "ContactName": "Fran Wilson", + "ContactTitle": "Sales Manager", + "Address": "89 Chiaroscuro Rd.", + "PostalCode": "97219", + "Country": "USA", + "Phone": "(503) 555-9573", + "Fax": "(503) 555-9646", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 48 + }, + { + "CustomerId": "24311ccf-0ae4-e7d4-e040-000a0e654788", + "CompanyName": "Magazzini Alimentari Riuniti", + "City": "Bergamo", + "ContactName": "Giovanni Rovelli", + "ContactTitle": "Marketing Manager", + "Address": "Via Ludovico il Moro 22", + "PostalCode": "24100", + "Country": "Italy", + "Phone": "035-640230", + "Fax": "035-640231", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 49 + }, + { + "CustomerId": "24311ccf-0be4-e7d4-e040-000a0e654788", + "CompanyName": "Maison Dewey", + "City": "Bruxelles", + "ContactName": "Catherine Dewey", + "ContactTitle": "Sales Agent", + "Address": "Rue Joseph-Bens 532", + "PostalCode": "B-1180", + "Country": "Belgium", + "Phone": "(02) 201 24 67", + "Fax": "(02) 201 24 68", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 50 + }, + { + "CustomerId": "24311ccf-0ce4-e7d4-e040-000a0e654788", + "CompanyName": "Mère Paillarde", + "City": "Montréal", + "ContactName": "Jean Fresnière", + "ContactTitle": "Marketing Assistant", + "Address": "43 rue St. Laurent", + "PostalCode": "H1J 1C3", + "Country": "Canada", + "Phone": "(514) 555-8054", + "Fax": "(514) 555-8055", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 51 + }, + { + "CustomerId": "24311ccf-0ee4-e7d4-e040-000a0e654788", + "CompanyName": "North/South", + "City": "London", + "ContactName": "Simon Crowther", + "ContactTitle": "Sales Associate", + "Address": "South House 300 Queensbridge", + "PostalCode": "SW7 1RZ", + "Country": "UK", + "Phone": "(171) 555-7733", + "Fax": "(171) 555-2530", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 52 + }, + { + "CustomerId": "24311ccf-0fe4-e7d4-e040-000a0e654788", + "CompanyName": "Océano Atlántico Ltda.", + "City": "Buenos Aires", + "ContactName": "Yvonne Moncada", + "ContactTitle": "Sales Agent", + "Address": "Ing. Gustavo Moncada 8585 Piso 20-A", + "PostalCode": "1010", + "Country": "Argentina", + "Phone": "(1) 135-5333", + "Fax": "(1) 135-5535", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 53 + }, + { + "CustomerId": "24311ccf-10e4-e7d4-e040-000a0e654788", + "CompanyName": "Old World Delicatessen", + "City": "Anchorage", + "ContactName": "Rene Phillips", + "ContactTitle": "Sales Representative", + "Address": "2743 Bering St.", + "PostalCode": "99508", + "Country": "USA", + "Phone": "(907) 555-7584", + "Fax": "(907) 555-2880", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 54 + }, + { + "CustomerId": "24311ccf-11e4-e7d4-e040-000a0e654788", + "CompanyName": "Ottilies Käseladen", + "City": "Köln", + "ContactName": "Henriette Pfalzheim", + "ContactTitle": "Owner", + "Address": "Mehrheimerstr. 369", + "PostalCode": "50739", + "Country": "Germany", + "Phone": "0221-0644327", + "Fax": "0221-0765721", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 55 + }, + { + "CustomerId": "24311ccf-12e4-e7d4-e040-000a0e654788", + "CompanyName": "Paris spécialités", + "City": "Paris", + "ContactName": "Marie Bertrand", + "ContactTitle": "Owner", + "Address": "265, boulevard Charonne", + "PostalCode": "75012", + "Country": "France", + "Phone": "(1) 42.34.22.66", + "Fax": "(1) 42.34.22.77", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 56 + }, + { + "CustomerId": "24311ccf-13e4-e7d4-e040-000a0e654788", + "CompanyName": "Pericles Comidas clásicas", + "City": "México D.F.", + "ContactName": "Guillermo Fernández", + "ContactTitle": "Sales Representative", + "Address": "Calle Dr. Jorge Cash 321", + "PostalCode": "05033", + "Country": "Mexico", + "Phone": "(5) 552-3745", + "Fax": "(5) 545-3745", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 57 + }, + { + "CustomerId": "24311ccf-14e4-e7d4-e040-000a0e654788", + "CompanyName": "Piccolo und mehr", + "City": "Salzburg", + "ContactName": "Georg Pipps", + "ContactTitle": "Sales Manager", + "Address": "Geislweg 14", + "PostalCode": "5020", + "Country": "Austria", + "Phone": "6562-9722", + "Fax": "6562-9723", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 58 + }, + { + "CustomerId": "24311ccf-15e4-e7d4-e040-000a0e654788", + "CompanyName": "Princesa Isabel Vinhos", + "City": "Lisboa", + "ContactName": "Isabel de Castro", + "ContactTitle": "Sales Representative", + "Address": "Estrada da saúde n. 58", + "PostalCode": "1756", + "Country": "Portugal", + "Phone": "(1) 356-5634", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 59 + }, + { + "CustomerId": "24311ccf-16e4-e7d4-e040-000a0e654788", + "CompanyName": "Que Delícia", + "City": "Rio de Janeiro", + "ContactName": "Bernardo Batista", + "ContactTitle": "Accounting Manager", + "Address": "Rua da Panificadora, 12", + "PostalCode": "02389-673", + "Country": "Brazil", + "Phone": "(21) 555-4252", + "Fax": "(21) 555-4545", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 60 + }, + { + "CustomerId": "24311ccf-17e4-e7d4-e040-000a0e654788", + "CompanyName": "Queen Cozinha", + "City": "Sao Paulo", + "ContactName": "Lúcia Carvalho", + "ContactTitle": "Marketing Assistant", + "Address": "Alameda dos Canàrios, 891", + "PostalCode": "05487-020", + "Country": "Brazil", + "Phone": "(11) 555-1189", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 61 + }, + { + "CustomerId": "24311ccf-18e4-e7d4-e040-000a0e654788", + "CompanyName": "QUICK-Stop", + "City": "Cunewalde", + "ContactName": "Horst Kloss", + "ContactTitle": "Accounting Manager", + "Address": "Taucherstraße 10", + "PostalCode": "01307", + "Country": "Germany", + "Phone": "0372-035188", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 62 + }, + { + "CustomerId": "24311ccf-19e4-e7d4-e040-000a0e654788", + "CompanyName": "Rancho grande", + "City": "Buenos Aires", + "ContactName": "Sergio Gutiérrez", + "ContactTitle": "Sales Representative", + "Address": "Av. del Libertador 900", + "PostalCode": "1010", + "Country": "Argentina", + "Phone": "(1) 123-5555", + "Fax": "(1) 123-5556", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 63 + }, + { + "CustomerId": "24311ccf-1ae4-e7d4-e040-000a0e654788", + "CompanyName": "Rattlesnake Canyon Grocery", + "City": "Albuquerque", + "ContactName": "Paula Wilson", + "ContactTitle": "Assistant Sales Representative", + "Address": "2817 Milton Dr.", + "PostalCode": "87110", + "Country": "USA", + "Phone": "(505) 555-5939", + "Fax": "(505) 555-3620", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 64 + }, + { + "CustomerId": "24311ccf-1be4-e7d4-e040-000a0e654788", + "CompanyName": "Reggiani Caseifici", + "City": "Reggio Emilia", + "ContactName": "Maurizio Moroni", + "ContactTitle": "Sales Associate", + "Address": "Strada Provinciale 124", + "PostalCode": "42100", + "Country": "Italy", + "Phone": "0522-556721", + "Fax": "0522-556722", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 65 + }, + { + "CustomerId": "24311ccf-1ce4-e7d4-e040-000a0e654788", + "CompanyName": "Ricardo Adocicados", + "City": "Rio de Janeiro", + "ContactName": "Janete Limeira", + "ContactTitle": "Assistant Sales Agent", + "Address": "Av. Copacabana, 267", + "PostalCode": "02389-890", + "Country": "Brazil", + "Phone": "(21) 555-3412", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 66 + }, + { + "CustomerId": "24311ccf-1de4-e7d4-e040-000a0e654788", + "CompanyName": "Richter Supermarkt", + "City": "Genève", + "ContactName": "Michael Holz", + "ContactTitle": "Sales Manager", + "Address": "Grenzacherweg 237", + "PostalCode": "1203", + "Country": "Switzerland", + "Phone": "0897-034214", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 67 + }, + { + "CustomerId": "24311ccf-1ee4-e7d4-e040-000a0e654788", + "CompanyName": "Romero y tomillo", + "City": "Madrid", + "ContactName": "Alejandra Camino", + "ContactTitle": "Accounting Manager", + "Address": "Gran Vía, 1", + "PostalCode": "28001", + "Country": "Spain", + "Phone": "(91) 745 6200", + "Fax": "(91) 745 6210", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 68 + }, + { + "CustomerId": "24311ccf-1fe4-e7d4-e040-000a0e654788", + "CompanyName": "Santé Gourmet", + "City": "Stavern", + "ContactName": "Jonas Bergulfsen", + "ContactTitle": "Owner", + "Address": "Erling Skakkes gate 78", + "PostalCode": "4110", + "Country": "Norway", + "Phone": "07-98 92 35", + "Fax": "07-98 92 47", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 69 + }, + { + "CustomerId": "24311ccf-20e4-e7d4-e040-000a0e654788", + "CompanyName": "Save-a-lot Markets", + "City": "Boise", + "ContactName": "Jose Pavarotti", + "ContactTitle": "Sales Representative", + "Address": "187 Suffolk Ln.", + "PostalCode": "83720", + "Country": "USA", + "Phone": "(208) 555-8097", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 70 + }, + { + "CustomerId": "24311ccf-21e4-e7d4-e040-000a0e654788", + "CompanyName": "Seven Seas Imports", + "City": "London", + "ContactName": "Hari Kumar", + "ContactTitle": "Sales Manager", + "Address": "90 Wadhurst Rd.", + "PostalCode": "OX15 4NB", + "Country": "UK", + "Phone": "(171) 555-1717", + "Fax": "(171) 555-5646", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 71 + }, + { + "CustomerId": "24311ccf-22e4-e7d4-e040-000a0e654788", + "CompanyName": "Simons bistro", + "City": "Kobenhavn", + "ContactName": "Jytte Petersen", + "ContactTitle": "Owner", + "Address": "Vinbæltet 34", + "PostalCode": "1734", + "Country": "Denmark", + "Phone": "31 12 34 56", + "Fax": "31 13 35 57", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 72 + }, + { + "CustomerId": "24311ccf-23e4-e7d4-e040-000a0e654788", + "CompanyName": "Spécialités du monde", + "City": "Paris", + "ContactName": "Dominique Perrier", + "ContactTitle": "Marketing Manager", + "Address": "25, rue Lauriston", + "PostalCode": "75016", + "Country": "France", + "Phone": "(1) 47.55.60.10", + "Fax": "(1) 47.55.60.20", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 73 + }, + { + "CustomerId": "24311ccf-24e4-e7d4-e040-000a0e654788", + "CompanyName": "Split Rail Beer Ale", + "City": "Lander", + "ContactName": "Art Braunschweiger", + "ContactTitle": "Sales Manager", + "Address": "P.O. Box 555", + "PostalCode": "82520", + "Country": "USA", + "Phone": "(307) 555-4680", + "Fax": "(307) 555-6525", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 74 + }, + { + "CustomerId": "24311ccf-25e4-e7d4-e040-000a0e654788", + "CompanyName": "Suprêmes délices", + "City": "Charleroi", + "ContactName": "Pascale Cartrain", + "ContactTitle": "Accounting Manager", + "Address": "Boulevard Tirou, 255", + "PostalCode": "B-6000", + "Country": "Belgium", + "Phone": "(071) 23 67 22 20", + "Fax": "(071) 23 67 22 21", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 75 + }, + { + "CustomerId": "24311ccf-26e4-e7d4-e040-000a0e654788", + "CompanyName": "The Big Cheese", + "City": "Portland", + "ContactName": "Liz Nixon", + "ContactTitle": "Marketing Manager", + "Address": "89 Jefferson Way Suite 2", + "PostalCode": "97201", + "Country": "USA", + "Phone": "(503) 555-3612", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 76 + }, + { + "CustomerId": "24311ccf-27e4-e7d4-e040-000a0e654788", + "CompanyName": "The Cracker Box", + "City": "Butte", + "ContactName": "Liu Wong", + "ContactTitle": "Marketing Assistant", + "Address": "55 Grizzly Peak Rd.", + "PostalCode": "59801", + "Country": "USA", + "Phone": "(406) 555-5834", + "Fax": "(406) 555-8083", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 77 + }, + { + "CustomerId": "24311ccf-28e4-e7d4-e040-000a0e654788", + "CompanyName": "Toms Spezialitäten", + "City": "Münster", + "ContactName": "Karin Josephs", + "ContactTitle": "Marketing Manager", + "Address": "Luisenstr. 48", + "PostalCode": "44087", + "Country": "Germany", + "Phone": "0251-031259", + "Fax": "0251-035695", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 78 + }, + { + "CustomerId": "24311ccf-29e4-e7d4-e040-000a0e654788", + "CompanyName": "Tortuga Restaurante", + "City": "México D.F.", + "ContactName": "Miguel Angel Paolino", + "ContactTitle": "Owner", + "Address": "Avda. Azteca 123", + "PostalCode": "05033", + "Country": "Mexico", + "Phone": "(5) 555-2933", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 79 + }, + { + "CustomerId": "24311ccf-2ae4-e7d4-e040-000a0e654788", + "CompanyName": "Tradição Hipermercados", + "City": "Sao Paulo", + "ContactName": "Anabela Domingues", + "ContactTitle": "Sales Representative", + "Address": "Av. Inês de Castro, 414", + "PostalCode": "05634-030", + "Country": "Brazil", + "Phone": "(11) 555-2167", + "Fax": "(11) 555-2168", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 80 + }, + { + "CustomerId": "24311ccf-2be4-e7d4-e040-000a0e654788", + "CompanyName": "Trail's Head Gourmet Provisioners", + "City": "Kirkland", + "ContactName": "Helvetius Nagy", + "ContactTitle": "Sales Associate", + "Address": "722 DaVinci Blvd.", + "PostalCode": "98034", + "Country": "USA", + "Phone": "(206) 555-8257", + "Fax": "(206) 555-2174", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 81 + }, + { + "CustomerId": "24311ccf-2ce4-e7d4-e040-000a0e654788", + "CompanyName": "Vaffeljernet", + "City": "Århus", + "ContactName": "Palle Ibsen", + "ContactTitle": "Sales Manager", + "Address": "Smagsloget 45", + "PostalCode": "8200", + "Country": "Denmark", + "Phone": "86 21 32 43", + "Fax": "86 22 33 44", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 82 + }, + { + "CustomerId": "24311ccf-2de4-e7d4-e040-000a0e654788", + "CompanyName": "Victuailles en stock", + "City": "Lyon", + "ContactName": "Mary Saveley", + "ContactTitle": "Sales Agent", + "Address": "2, rue du Commerce", + "PostalCode": "69004", + "Country": "France", + "Phone": "78.32.54.86", + "Fax": "78.32.54.87", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 83 + }, + { + "CustomerId": "24311ccf-2ee4-e7d4-e040-000a0e654788", + "CompanyName": "Vins et alcools Chevalier", + "City": "Reims", + "ContactName": "Paul Henriot", + "ContactTitle": "Accounting Manager", + "Address": "59 rue de l'Abbaye", + "PostalCode": "51100", + "Country": "France", + "Phone": "26.47.15.10", + "Fax": "26.47.15.11", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 84 + }, + { + "CustomerId": "24311ccf-2fe4-e7d4-e040-000a0e654788", + "CompanyName": "Die Wandernde Kuh", + "City": "Stuttgart", + "ContactName": "Rita Müller", + "ContactTitle": "Sales Representative", + "Address": "Adenauerallee 900", + "PostalCode": "70563", + "Country": "Germany", + "Phone": "0711-020361", + "Fax": "0711-035428", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 85 + }, + { + "CustomerId": "24311ccf-30e4-e7d4-e040-000a0e654788", + "CompanyName": "Wartian Herkku", + "City": "Oulu", + "ContactName": "Pirkko Koskitalo", + "ContactTitle": "Accounting Manager", + "Address": "Torikatu 38", + "PostalCode": "90110", + "Country": "Finland", + "Phone": "981-443655", + "Fax": "981-443655", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 86 + }, + { + "CustomerId": "24311ccf-31e4-e7d4-e040-000a0e654788", + "CompanyName": "Wellington Importadora", + "City": "Resende", + "ContactName": "Paula Parente", + "ContactTitle": "Sales Manager", + "Address": "Rua do Mercado, 12", + "PostalCode": "08737-363", + "Country": "Brazil", + "Phone": "(14) 555-8122", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 87 + }, + { + "CustomerId": "24311ccf-32e4-e7d4-e040-000a0e654788", + "CompanyName": "White Clover Markets", + "City": "Seattle", + "ContactName": "Karl Jablonski", + "ContactTitle": "Owner", + "Address": "305 - 14th Ave. S. Suite 3B", + "PostalCode": "98128", + "Country": "USA", + "Phone": "(206) 555-4112", + "Fax": "(206) 555-4115", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 88 + }, + { + "CustomerId": "24311ccf-33e4-e7d4-e040-000a0e654788", + "CompanyName": "Wilman Kala", + "City": "Helsinki", + "ContactName": "Matti Karttunen", + "ContactTitle": "Owner/Marketing Assistant", + "Address": "Keskuskatu 45", + "PostalCode": "21240", + "Country": "Finland", + "Phone": "90-224 8858", + "Fax": "90-224 8858", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 89 + }, + { + "CustomerId": "24311ccf-34e4-e7d4-e040-000a0e654788", + "CompanyName": "Wolski Zajazd", + "City": "Warszawa", + "ContactName": "Zbyszek Piestrzeniewicz", + "ContactTitle": "Owner", + "Address": "ul. Filtrowa 68", + "PostalCode": "01-012", + "Country": "Poland", + "Phone": "(26) 642-7012", + "Fax": "(26) 642-7012", + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 90 + }, + { + "CustomerId": "24311ccf-0de4-e7d4-e040-000a0e654788", + "CompanyName": "Morgenstern Gesundkost", + "City": "Leipzig", + "ContactName": "Alexander Feuer", + "ContactTitle": "Marketing Assistant", + "Address": "Heerstr. 22", + "PostalCode": "04179", + "Country": "Germany", + "Phone": "0342-023176", + "Fax": null, + "TidsStempel": 1, + "OpprettetAv": "InfrastructureTestSc", + "OpprettetTid": "2016-01-10T00:00:00", + "SistEndretAv": "InfrastructureTestSc", + "SistEndretTid": "2016-01-10T00:00:00", + "DipsId": 91 + } +] \ No newline at end of file diff --git a/src/Tests.Dapper.Oracle/OracleValueConverterTests.cs b/src/Tests.Dapper.Oracle/OracleValueConverterTests.cs index 31de86f..1b39101 100644 --- a/src/Tests.Dapper.Oracle/OracleValueConverterTests.cs +++ b/src/Tests.Dapper.Oracle/OracleValueConverterTests.cs @@ -63,7 +63,15 @@ public void GetOracleDateTimeReturnsDateTime() { var result = OracleValueConverter.Convert(new OracleDate(DateTime.Today)); result.Should().Be(DateTime.Today); - } + } + + [Fact] + public void GetOracleNumberReturnAsDecimal() + { + decimal expected = 100; + var result = OracleValueConverter.Convert(100); + result.Should().Be(expected); + } } diff --git a/src/Tests.Dapper.Oracle/README.txt b/src/Tests.Dapper.Oracle/README.txt index 2db4cef..33e46c6 100644 --- a/src/Tests.Dapper.Oracle/README.txt +++ b/src/Tests.Dapper.Oracle/README.txt @@ -13,5 +13,6 @@ c) Add two environment variables to your computer: DA_OR_PWD - password for registered oracle-user at container-registry.oracle.com The build script needs those two set to be able to perform a docker login command to download the docker container. + The integration tests will execute the script /scripts/LocalOracleDockerDb.ps1, that script can also be invoked from a powershell prompt. diff --git a/src/Tests.Dapper.Oracle/Tests.Dapper.Oracle.csproj b/src/Tests.Dapper.Oracle/Tests.Dapper.Oracle.csproj index 2cd8bb8..5942887 100644 --- a/src/Tests.Dapper.Oracle/Tests.Dapper.Oracle.csproj +++ b/src/Tests.Dapper.Oracle/Tests.Dapper.Oracle.csproj @@ -22,7 +22,9 @@ + +