ikvmc.exe -classloader:ikvm.runtime.AppDomainAssemblyClassLoader -target:library db2jcc4.jar db2jcc_license_cu.jar -out:db2jcc4.dll
using System; using com.ibm.db2.jcc; using java.sql; using Thread = java.lang.Thread; using Class = java.lang.Class; using String = System.String; using Connection = java.sql.Connection; using Statement = java.sql.Statement; using DriverManager = java.sql.DriverManager; using ResultSet = java.sql.ResultSet; namespace jdbc { class Program { static void Main(string[] args) { Class.forName( typeof(com.ibm.db2.jcc.DB2Driver).AssemblyQualifiedName, true, Thread.currentThread().getContextClassLoader()); String url = "jdbc:db2://192.168.72.135:50000/DB1:user=root;password=password;"; using (Connection conn = DriverManager.getConnection(url)) { String sql = "SELECT * FROM TABLE(VALUES( CAST( :p AS VARCHAR(100)) , 'It is work')) AS T(ID, LOG)"; using (var stmt = conn.prepareCall(sql)) { stmt.setString("p","1234"); using (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { //Retrieve by column name String id = rs.getString("ID"); String log = rs.getString("LOG"); global::System.Console.WriteLine("LOG: " + id + " : " + log); } } } } } } }
public sealed class Db2Connection : DbConnection, ICloneable
static Db2Connection() { Class.forName( typeof(com.ibm.db2.jcc.DB2Driver).AssemblyQualifiedName, true, Thread.currentThread().getContextClassLoader()); }
Class.forName("com.ibm.db2.jcc.DB2Driver");
connector = DriverManager.getConnection(_connectionString);
jdbc:db2://192.168.72.135:50000/DB1:currentSchema=DB01;user=root;password=password;fullyMaterializeLobData=true;DB2NETNamedParam=1;
public sealed class Db2Command : DbCommand, ICloneable
new Regex(@"\(:(?<n>\w+)\d+,:\1\d+\)");
SqlMapper.AddTypeHandler(DapperULongHandler.Default);
internal static CallableStatement PrepareExecute(Db2Connection connection, string query, Db2ParameterCollection parameters)
internal static string PrepareCommandText(string query, Db2ParameterCollection parameters, ref int parameter)
private static void PrepareParameters(CallableStatement stmt, Db2ParameterCollection parameters)
public sealed class Db2ParameterCollection : DbParameterCollection, IList<Db2Parameter>
public sealed class Db2Parameter : DbParameter, ICloneable
public override DbType DbType
public object Clone()
public override int IndexOf(string parameterName)
otherwise nothing substantial. internal sealed class Db2DataReader : DbDataReader
new Regex(@"(?<q>[^;]+);?");
new Regex(@"(?<n>:\w+)");
and the familiar Db2Command.PrepareCommandText method for replacing positional parameters with their named parameters (as a bonus: Dapper can properly work on named parameters in multi queries). var b = _statement.getMoreResults(); if (b) { _rs = _statement.getResultSet(); } else { _statement = PrepareStatementAndResultSet(); if (_statement != null) { _rs = _statement.executeQuery(); b = true; } }
SELECT r.ID , r.INCOME , r.GU_CODE as GuCode , r.NO as No , r.DIVISION , d.NAME as DivisionName , u.LNAME || ' ' || u.FNAME || nvl(' ' || u.MNAME, '') as CreaterName , r.SIGNED , r.SIGNED_SYSUSER_ID as SignedID , su.LNAME || ' ' || su.FNAME || nvl(' ' || su.MNAME, '') as SignedName --, (select count(*) from PACK_ENTRY p where p.REGISTRY_ID = r.ID) as PackCount -- Use C# code --, (select count(*) -- from PACK_ENTRY p -- join FILE_ENTRY f on f.PACK_ID=p.ID -- where p.REGISTRY_ID = r.ID) as FileCount -- Use C# code -- TODO 2016-04-13 emiya: . REGISTRY_ENTRY , (select p.CLOSE_DATE from PACK_ENTRY p join REGISTRY_TO_PACK p2p on p2p.REGISTRY_ID = r.ID and p2p.PACK_ID = p.ID order by p.INCOME fetch first 1 rows only) as CloseDate , (select p.CATEGORY_ID from PACK_ENTRY p join REGISTRY_TO_PACK p2p on p2p.REGISTRY_ID = r.ID and p2p.PACK_ID = p.ID order by p.INCOME fetch first 1 rows only) as CategoryCode , (select l.SHORTNAME from PACK_ENTRY p join CATEGORY_LIST l on l.ID = p.CATEGORY_ID join REGISTRY_TO_PACK p2p on p2p.REGISTRY_ID = r.ID and p2p.PACK_ID = p.ID order by p.INCOME fetch first 1 rows only) as CategoryName , p2p.REGISTRY_ID , p.ID , p.INCOME , p.CLOSE_DATE as CloseDate , p.CATEGORY_ID as CategoryCode , l.SHORTNAME as CategoryName , p.GU_CODE as GuCode , p.NO , p.DIVISION , p.SYSUSER_ID as SysUserID , (select count(*) from FILE_ENTRY where PACK_ID = p.ID) as Count , r.SIGNED , p.PLACE , p2p.STATUS , p2p.NOTE from REGISTRY_ENTRY r join DIVISION d on d.CODE=r.DIVISION join SYSUSER u on u.ID=r.SYSUSER_ID LEFT JOIN SYSUSER su ON su.ID=r.SIGNED_SYSUSER_ID join REGISTRY_TO_PACK p2p on p2p.REGISTRY_ID = r.ID join PACK_ENTRY p on p.ID = p2p.PACK_ID join CATEGORY_LIST l on l.ID = p.CATEGORY_ID WHERE r.ID=? AND @DIVISION order by r.ID,p.GU_CODE,p.NO
Source: https://habr.com/ru/post/303878/
All Articles