NativeTypeMapping = new NpgsqlNativeTypeMapping();
- NativeTypeMapping.AddType("text", NpgsqlDbType.Text, DbType.String, true,
- new ConvertNativeToBackendHandler(BasicNativeToBackendTypeConverter.ToString));
+ NativeTypeMapping.AddType("text", NpgsqlDbType.Text, DbType.String, true, null);
NativeTypeMapping.AddDbTypeAlias("text", DbType.StringFixedLength);
NativeTypeMapping.AddDbTypeAlias("text", DbType.AnsiString);
NativeTypeMapping.AddDbTypeAlias("text", DbType.AnsiStringFixedLength);
NativeTypeMapping.AddTypeAlias("text", typeof(String));
+ NativeTypeMapping.AddType("varchar", NpgsqlDbType.Varchar, DbType.String, true, null);
+
NativeTypeMapping.AddType("bytea", NpgsqlDbType.Bytea, DbType.Binary, true,
new ConvertNativeToBackendHandler(BasicNativeToBackendTypeConverter.ToBinary));
NativeTypeMapping.AddTypeAlias("int2", typeof(Int16));
+ NativeTypeMapping.AddDbTypeAlias("int2", DbType.Byte);
+
NativeTypeMapping.AddType("int4", NpgsqlDbType.Integer, DbType.Int32, false,
null);
new NpgsqlBackendTypeInfo(0, "bpchar", NpgsqlDbType.Text, DbType.String, typeof(String),
null),
- new NpgsqlBackendTypeInfo(0, "varchar", NpgsqlDbType.Text, DbType.String, typeof(String),
+ new NpgsqlBackendTypeInfo(0, "varchar", NpgsqlDbType.Varchar, DbType.String, typeof(String),
null),
new NpgsqlBackendTypeInfo(0, "text", NpgsqlDbType.Text, DbType.String, typeof(String),
/// </summary>
internal class NpgsqlBackendTypeInfo
{
- private event ConvertBackendToNativeHandler _ConvertBackendToNative;
+ private ConvertBackendToNativeHandler _ConvertBackendToNative;
internal Int32 _OID;
private String _Name;
/// <param name="NpgsqlDbType">NpgsqlDbType</param>
/// <param name="Type">System type to convert fields of this type to.</param>
/// <param name="ConvertBackendToNative">Data conversion handler.</param>
- public NpgsqlBackendTypeInfo(Int32 OID, String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Type Type,
- ConvertBackendToNativeHandler ConvertBackendToNative)
+ public NpgsqlBackendTypeInfo(Int32 OID, String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Type Type, ConvertBackendToNativeHandler ConvertBackendToNative)
{
_OID = OID;
_Name = Name;
return _ConvertBackendToNative(this, BackendData, TypeSize, TypeModifier);
} else {
try {
- return Convert.ChangeType(BackendData, Type, CultureInfo.InvariantCulture);
+ return Convert.ChangeType(BackendData, Type, CultureInfo.InvariantCulture);
} catch {
return BackendData;
}
/// </summary>
internal class NpgsqlNativeTypeInfo
{
- private event ConvertNativeToBackendHandler _ConvertNativeToBackend;
+ private static NumberFormatInfo ni;
+
+ private ConvertNativeToBackendHandler _ConvertNativeToBackend;
private String _Name;
private NpgsqlDbType _NpgsqlDbType;
private DbType _DbType;
private Boolean _Quote;
+
+ static NpgsqlNativeTypeInfo()
+ {
+ ni = new CultureInfo("en-US").NumberFormat;
+ ni.NumberGroupSeparator = "";
+ }
/// <summary>
/// Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
/// <param name="Type">System type to convert fields of this type to.</param>
/// <param name="ConvertBackendToNative">Data conversion handler.</param>
/// <param name="ConvertNativeToBackend">Data conversion handler.</param>
- public NpgsqlNativeTypeInfo(String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Boolean Quote,
- ConvertNativeToBackendHandler ConvertNativeToBackend)
+ public NpgsqlNativeTypeInfo(String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Boolean Quote, ConvertNativeToBackendHandler ConvertNativeToBackend)
{
_Name = Name;
_NpgsqlDbType = NpgsqlDbType;
/// <summary>
/// Perform a data conversion from a native object to
/// a backend representation.
- /// DBNull will always be converted to "NULL".
+ /// DBNull and null values are handled differently depending if a plain query is used
+ /// When
/// </summary>
/// <param name="NativeData">Native .NET object to be converted.</param>
- /// <param name="SuppressQuoting">Never add quotes (only applies to certain types).</param>
- public String ConvertToBackend(Object NativeData, Boolean SuppressQuoting)
+ /// <param name="ForExtendedQuery">Flag indicating if the conversion has to be done for
+ /// plain queries or extended queries</param>
+ public String ConvertToBackend(Object NativeData, Boolean ForExtendedQuery)
+ {
+ if (ForExtendedQuery)
+ return ConvertToBackendExtendedQuery(NativeData);
+ else
+ return ConvertToBackendPlainQuery(NativeData);
+
+ }
+
+ private String ConvertToBackendPlainQuery(Object NativeData)
+ {
+ if ((NativeData == DBNull.Value) || (NativeData == null))
+ return "NULL"; // Plain queries exptects null values as string NULL.
+
+ if (_ConvertNativeToBackend != null)
+ return QuoteString(_ConvertNativeToBackend(this, NativeData));
+ else
+ {
+
+
+ if (NativeData is System.Enum)
+ {
+ // Do a special handling of Enum values.
+ // Translate enum value to its underlying type.
+ return QuoteString((String)Convert.ChangeType(Enum.Format(NativeData.GetType(), NativeData, "d"), typeof(String), CultureInfo.InvariantCulture));
+ }
+ else if (NativeData is Double)
+ {
+ return QuoteString(((Double)NativeData).ToString("N", ni).Replace("'", "''").Replace("\\", "\\\\"));
+
+ }
+ else if (NativeData is Decimal)
+ {
+ return QuoteString(((Decimal)NativeData).ToString("N", ni).Replace("'", "''").Replace("\\", "\\\\"));
+ }
+ // Do special handling of strings when in simple query. Escape quotes and backslashes.
+ return QuoteString(NativeData.ToString().Replace("'", "''").Replace("\\", "\\\\"));
+
+ }
+
+ }
+
+ private String ConvertToBackendExtendedQuery(Object NativeData)
{
- if (NativeData == DBNull.Value) {
- return "NULL";
- } else if (_ConvertNativeToBackend != null) {
- return QuoteString(! SuppressQuoting, _ConvertNativeToBackend(this, NativeData));
- } else {
- return QuoteString(! SuppressQuoting, (String)Convert.ChangeType(NativeData, typeof(String), CultureInfo.InvariantCulture));
+ if ((NativeData == DBNull.Value) || (NativeData == null))
+ return null; // Extended query expects null values be represented as null.
+
+ if (_ConvertNativeToBackend != null)
+ return _ConvertNativeToBackend(this, NativeData);
+ else
+ {
+ if (NativeData is System.Enum)
+ {
+ // Do a special handling of Enum values.
+ // Translate enum value to its underlying type.
+ return (String)Convert.ChangeType(Enum.Format(NativeData.GetType(), NativeData, "d"), typeof(String), CultureInfo.InvariantCulture);
+ }
+ else if (NativeData is Double)
+ {
+ return ((Double)NativeData).ToString("N", ni);
+
+ }
+ else if (NativeData is Decimal)
+ {
+ return ((Decimal)NativeData).ToString("N", ni);
+ }
+
+ return NativeData.ToString();
+
}
+
}
- private static String QuoteString(Boolean Quote, String S)
+ private static String QuoteString(String S)
{
- if (Quote) {
- return String.Format("'{0}'", S);
- } else {
- return S;
- }
+ return String.Format("'{0}'", S);
+
}
}