diff --git a/TestApp/HybrydLock.cs b/TestApp/HybrydLock.cs new file mode 100644 index 0000000..abc7bc9 --- /dev/null +++ b/TestApp/HybrydLock.cs @@ -0,0 +1,28 @@ +using System.Threading; + +namespace TestApp +{ + public class HybrydLock + { + private AutoResetEvent _lock = new AutoResetEvent(false); + private volatile int _counter = 0; + + public void Enter() + { + if (Interlocked.Increment(ref _counter) == 1) + { + return; + } + _lock.WaitOne(); + } + + public void Leave() + { + if (Interlocked.Decrement(ref _counter) == 0) + { + return; + } + _lock.Set(); + } + } +} diff --git a/ZeroLevel.SQL/DBReader.cs b/ZeroLevel.SQL/DBReader.cs index 9d23222..99b7af6 100644 --- a/ZeroLevel.SQL/DBReader.cs +++ b/ZeroLevel.SQL/DBReader.cs @@ -33,7 +33,8 @@ namespace ZeroLevel.SqlServer { public static T Read(this DbDataReader reader, int index) { - if (reader[index] == DBNull.Value) return default(T); + if (reader == null) return default; + if (reader[index] == DBNull.Value) return default; Type t; if ((t = Nullable.GetUnderlyingType(typeof(T))) != null) { @@ -43,7 +44,53 @@ namespace ZeroLevel.SqlServer } public static T Read(this DbDataReader reader, string name) { - if (reader[name] == DBNull.Value) return default(T); + if (reader == null) return default; + if (reader[name] == DBNull.Value) return default; + Type t; + if ((t = Nullable.GetUnderlyingType(typeof(T))) != null) + { + return (T)Convert.ChangeType(reader[name], t); + } + return (T)Convert.ChangeType(reader[name], typeof(T)); + } + public static T Read(this IDataReader reader, int index) + { + if (reader == null) return default; + if (reader[index] == DBNull.Value) return default; + Type t; + if ((t = Nullable.GetUnderlyingType(typeof(T))) != null) + { + return (T)Convert.ChangeType(reader[index], t); + } + return (T)Convert.ChangeType(reader[index], typeof(T)); + } + public static T Read(this IDataReader reader, string name) + { + if (reader == null) return default; + if (reader[name] == DBNull.Value) return default; + Type t; + if ((t = Nullable.GetUnderlyingType(typeof(T))) != null) + { + return (T)Convert.ChangeType(reader[name], t); + } + return (T)Convert.ChangeType(reader[name], typeof(T)); + } + + public static T Read(this DataRow reader, int index) + { + if (reader == null) return default; + if (reader.ItemArray[index] == DBNull.Value) return default; + Type t; + if ((t = Nullable.GetUnderlyingType(typeof(T))) != null) + { + return (T)Convert.ChangeType(reader.ItemArray[index], t); + } + return (T)Convert.ChangeType(reader.ItemArray[index], typeof(T)); + } + public static T Read(this DataRow reader, string name) + { + if (reader == null) return default; + if (reader[name] == DBNull.Value) return default; Type t; if ((t = Nullable.GetUnderlyingType(typeof(T))) != null) {