Услуги Сертификаты Новости Статьи База знаний Алгоритмы Портфолио Скачать Ссылки Поиск
Услуги arrow Новости
Mapping: RAW Oracle type to Guid Версия для печати Отправить на e-mail
04.07.2014

Стандартно тип Oracle RAW(16) маппится в Guid на стороне кода C# без дополнительных преобразований.

Но, может возникнуть ситуация, когда преобразования потребуются. Например, если RAW не 16 байт, а больше, например, 36.

В данном примере приведен обработчик на примере 16 байт. Для другого размера Вам придется модифицировать код в RawType классе в методах NullSafeGet и NullSafeSet.

Шаги:

1. Нужно реализовать класс, который будет представлять в C# коде этот тип данных (в данном случае RAW(36)).

  1. public class RawType : IUserType  
  2. {  
  3.     public static string GenerateNewId()  
  4.     {  
  5.         Guid nextVal = Guid.NewGuid();  
  6.         return nextVal.ToString("N");  
  7.     }  
  8.   
  9.     private static SqlType[] types = new SqlType[] {new SqlType(DbType.Binary)};  
  10.   
  11.     public object Assemble(object cached, object owner)  
  12.     {  
  13.         return DeepCopy(cached);  
  14.     }  
  15.   
  16.     public new bool Equals(object x, object y)  
  17.     {  
  18.         return (x != null && x.Equals(y));  
  19.     }  
  20.   
  21.     public object DeepCopy(object value)  
  22.     {  
  23.         return value;  
  24.     }  
  25.   
  26.     public object Disassemble(object value)  
  27.     {  
  28.         return DeepCopy(value);  
  29.     }  
  30.   
  31.     public int GetHashCode(object x)  
  32.     {  
  33.         return x.GetHashCode();  
  34.     }  
  35.   
  36.     public bool IsMutable  
  37.     {  
  38.         get { return true; }  
  39.     }  
  40.   
  41.     public object NullSafeGet(IDataReader rs, string[] names, object owner)  
  42.     {  
  43.         string result = null;  
  44.         byte[] buffer = (byte[]) NHibernateUtil.Binary.NullSafeGet(rs, names[0]);  
  45.         if (null != buffer)  
  46.         {  
  47.             result = new Guid(buffer).ToString("N");  
  48.             Array.Clear(buffer, 0, buffer.Length);  
  49.         }  
  50.         return result;  
  51.     }  
  52.   
  53.     public void NullSafeSet(IDbCommand cmd, object value, int index)  
  54.     {  
  55.         if (null != value)  
  56.         {  
  57.             byte[] buffer = new Guid(((string) value)).ToByteArray();  
  58.             NHibernateUtil.Binary.NullSafeSet(cmd, buffer, index);  
  59.             Array.Clear(buffer, 0, buffer.Length);  
  60.         }  
  61.     }  
  62.   
  63.     public object Replace(object original, object target, object owner)  
  64.     {  
  65.         return original;  
  66.     }  
  67.   
  68.     public Type ReturnedType  
  69.     {  
  70.         get { return typeof ( Guid ); }  
  71.     }  
  72.   
  73.     public SqlType[] SqlTypes  
  74.     {  
  75.         get { return types; }  
  76.     }  
  77. }  

Скачать

2. Реализовать соглашение в коде (Convention) для Id и Property, если у Вас в БД идентификаторы и свойства имеют данный тип. По крайней мере, у меня было так.

Соглашение для Id (C# тип Guid, в Oracle тип RAW(36))

  1. public class OracleIdConvention : IIdConvention, IIdConventionAcceptance  
  2. {  
  3.     public void Accept( IAcceptanceCriteria<IIdentityInspector> criteria )  
  4.     {  
  5.         criteria.Expect( pi => IsGuid( pi ) );  
  6.     }  
  7.   
  8.     public void Apply( FluentNHibernate.Conventions.Instances.IIdentityInstance instance   
  9.     {  
  10.         instance.CustomType( typeof( RawType ) );  
  11.     }  
  12.   
  13.     private bool IsGuid( FluentNHibernate.Conventions.Inspections.IIdentityInspector pi )  
  14.     {  
  15.         return pi.Type == typeof( Guid ) || pi.Type == typeof( Guid? );  
  16.     }  
  17. }  

Скачать

Соглашение для Property (C# тип Guid, в Oracle тип RAW(36))

  1. public class OracleGuidConvention : IPropertyConvention, IPropertyConventionAcceptance  
  2. {  
  3.     /// <summary>  
  4.     /// Guarantees that this convention will only be applied to property of Guid types.  
  5.     /// </summary>  
  6.     public void Accept( IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria )  
  7.     {  
  8.         criteria.Expect( pi => IsGuid( pi ) );  
  9.     }  
  10.   
  11.     /// <summary>  
  12.     /// Specifies that Guid properties should be mapped to "RAW" (because Oracle doesn't have a Guid type).  
  13.     /// </summary>  
  14.     public void Apply( IPropertyInstance instance )  
  15.     {  
  16.         instance.CustomType( typeof( RawType ) );  
  17.     }  
  18.   
  19.     private bool IsGuid( FluentNHibernate.Conventions.Inspections.IPropertyInspector pi )  
  20.     {  
  21.         return pi.Type == typeof( Guid ) || pi.Type == typeof( Guid? );  
  22.     }  
  23. }  

Скачать

Соглашения нужно зарегистрировать в списке соглашений (Conventions.Add(...)) в момент инициализации FluentConfiguration

Последнее обновление ( 04.07.2014 )
 
Удалить сайт в IIS Express (Appcmd) Версия для печати Отправить на e-mail
30.06.2014

Удалять кэш сайта в IIS Express можно разными способами.

Вот два:

1. Можно воспользоваться утилитой Microsoft WebMatrix. Она распространяется бесплатно. Удобная, наглядная. Включена в дистрибутив IIS Express 8.

2. Используя утилиту командной строки AppCmd из папки IIS Express.

Пример:

appcmd.exe delete site "Название Вашего сайта" 

Путь к утилите: "C:\Program Files (x86)\IIS Express\", либо "C:\Program Files\IIS Express\"

 

PS: если Вам была полезна данная статья, поддержите наш ресурс, нажмите кнопочку "+1" вверху страницы. Спасибо!

 

 
TT(T4) debug in Visual Studio Версия для печати Отправить на e-mail
23.06.2014

Возможно, у Вас возникнет ситуация, когда потребуется выполнять отладку T4 шаблона, который используется, например, для генерации вспомогательного кода C# в момент сборки проекта.


Чтобы включить отладчик, потребуется в шаблон добавить принудительный вызов отладчика. 


<#@ template language="C#" debug="true" #>
<#@ import namespace="System.Diagnostics" #>
<# Debugger.Launch(); #> 
 

PS: если Вам была полезна данная статья, поддержите наш ресурс, нажмите кнопочку "+1" вверху страницы. Спасибо!

 
Array: check on duplicates Версия для печати Отправить на e-mail
14.03.2014
Given an array of size N in which every number is between 1 and N, determine if there are any duplicates in it. You are allowed to destroy the array if you like. Do not sort the array or use bit vectors. Try to work within the array without using any other temporary data structures. Do not use 2 nesting for loops since the time complexity would be high. Try to find a solution by executing just one loop. Hint: manipulate the elements of the same array as you loop through.

var hasDuplicates = function(arr) {
    var index;
    for (var i = 0, len = arr.length; i < len; i++) {
        index = Math.abs(arr[i]) - 1;
        if (arr[index] > 0) {
            arr[index] = (-1) * arr[index];
        } else {
            return true;
        }
    }
    return false;
};
Последнее обновление ( 14.03.2014 )
 
Visual Studio Out of Memory exceptions Версия для печати Отправить на e-mail
10.03.2014

As you probably know Visual Studio requires quite a bit of memory resources, especially if your solution is fairly large. Important to know is that the Visual Studio memory use is limited to 2GB of virtual memory. This is true even when you are running Visual Studio on a 64-bit OS because VS is still a 32-bit application.

When Visual Studio + all Add-Ins memory use gets close to the 2GB limit it throws the OutOfMemoryException which cannot be caught nor handled.

To address this issue to an extent you can make Visual Studio use up to 3GB of virtual memory.

First of all, tell the OS to increase the amount of user-mode memory from 2GB to 3GB. (If you are running on 64-bit, skip this step)

  • For Windows 7: Run the following from the command prompt:
    BCDEDIT /Set IncreaseUserVa 3072

Next step is to make Visual Studio aware of the larger address space:

  • Be sure to backup devenv.exe
  • From the command prompt navigate to "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE"  and execute the following: 
    editbin /LARGEADDRESSAWARE devenv.exe
  • Reboot your computer
 
Or you can create CMD file:

cd\
cd C:\Program Files\Microsoft Visual Studio 10.0
vc\bin\editbin.exe /LARGEADDRESSAWARE common7\IDE\devenv.exe 

OR 

SET PATH=%PATH%;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ 

CD "C:\Program Files\Microsoft Visual Studio 10.0\VC\"

editbin /LARGEADDRESSAWARE "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" 

Solution was found here .

Последнее обновление ( 10.03.2014 )
 
Еще...
<< В начало < Предыдущая 1 2 Следующая > В конец >>

Всего 1 - 105 из 169