-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Invalid cast from 'System.String' to 'System.Guid' #447
Comments
First have to ask about the constraints here: Why aren't you using an actual |
Yes, I'd agree with you: we should make this work. Can I check - is this Out of mild curiosity, is there a reason you aren't using the On 1 February 2016 at 13:29, Tim Regan [email protected] wrote:
Regards, Marc |
Also as a workaround for others if this is a real constraint, there's a simpler approach: Convert(UniqueIdentifier, id) as id |
Question: Why not use UNIQUEIDENTIFIER in SQL?
Question: Is this using just the core dapper package? I'll swap NVARCHAR(128) to UNIQUEIDENTIFIER and try Nick's workaround. |
@dumbledad if you switch the type, no need for any workaround at all - types will match and it'll just work :) |
Where's the 'like' button ;-) |
I will try and fix this for completionist reasons, but: changing to
|
+1 for this enhancement from me too. |
+1 for me too please (using mysql nvarchar(64) mapped to a Guid in .net) |
Would be great when the poor souls using MySQL have a binary(16) representing a GUID and cannot map using Dapper. |
There is a beta on nuget that may fix this. Any volunteers? On Tue, 8 Nov 2016 18:55 mtrtm, [email protected] wrote:
|
Does the beta only support char(32) in MySQL to .net Guid, or does it also support binary(16) to Guid? |
It's not an issue for me right now (did some casting at the db side), but if you really want to know @mtrtm then I suggest you test it out and post your reproducible results right here. It will help the actual developers/contributors to fix it. |
Hey guys, It is unclear exactly what you would like tested, but I will probably have some time over the next day or two if you would like to provide what you want tested, what version you'd like me to test etc. |
Yeah, I think nuget dropped my upload. Will redo tomorrow. On 8 Nov 2016 11:43 p.m., "mtrtm" [email protected] wrote:
|
@mgravell Did the beta upload ever make it to nuget? we are looking at switching over to binary(16), and dapper really doesn't like it. Edit: nevermind, binary(16) seems to work fine in 1.50.3-beta1. Now i just need to know a release date. Is there one in mind? |
Yes, however based on the feedback in this thread, I suspect we should
revert this feature - it is unreliable between vendors.
https://www.nuget.org/packages/Dapper/1.50.3-beta1
…On 6 December 2016 at 21:45, normanthesquid ***@***.***> wrote:
@mgravell <https://github.com/mgravell> Did the beta upload ever make it
to nuget? we are looking at switching over to binary(16), and dapper really
doesn't like it.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#447 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AABDsLytDC4cU51YqHb-mPSVFFaJ1LRaks5rFddfgaJpZM4HQicA>
.
--
Regards,
Marc
|
Update: this was reverted due to vendor issues underneath. We simply can't support this convenience mapping and instead encourage the correct type. I'm adding it to the overall issue like in V2 to consider for the |
It seems with this commit, we may be able to accomplish the MySql binary(16) to C# Guid. However, it isn't in 1.50.2... Something like this:
|
The ultimate problem here is that there is no reliable way to automate when
to do this and when not to, especially since various interception
techniques can sit between dapper and the connection (so we can't just
check for MySqlConnection). If it is manual: people will not do it
consistently and will often not even realise they've been corrupting their
data until they try accessing it a different way. It becomes actively
harmful.
…On 6 Feb 2017 5:20 a.m., "Clay Anderson" ***@***.***> wrote:
It seems with this commit, we may be able to accomplish the MySql
binary(16) to C# Guid.
8aa10a0
<8aa10a0>
Something like this:
Main()
{
SqlMapper.AddTypeHandler(new MySqlGuidTypeHandler());
SqlMapper.RemoveTypeMap(typeof(Guid));
SqlMapper.RemoveTypeMap(typeof(Guid?));
}
public class MySqlGuidTypeHandler : SqlMapper.TypeHandler<Guid>
{
public override void SetValue(IDbDataParameter parameter, Guid guid)
{
parameter.Value = FlipEndian(guid.ToByteArray());
}
public override Guid Parse(object value)
{
return new Guid(FlipEndian((byte[]) value));
}
internal static byte[] FlipEndian(byte[] oldBytes)
{
var newBytes = new byte[16];
for (var i = 8; i < 16; i++)
newBytes[i] = oldBytes[i];
newBytes[3] = oldBytes[0];
newBytes[2] = oldBytes[1];
newBytes[1] = oldBytes[2];
newBytes[0] = oldBytes[3];
newBytes[5] = oldBytes[4];
newBytes[4] = oldBytes[5];
newBytes[6] = oldBytes[7];
newBytes[7] = oldBytes[6];
return newBytes;
}
}
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#447 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AABDsPp9mR1HjWQw7wh6VVQ6z0dcKRdgks5rZq2TgaJpZM4HQicA>
.
|
@mgravell I was indeed able to customize the way Dapper converts the I did this with 1.50.2 and cherry-picked commit 8aa10a (8aa10a0) I'm not sure what else was in 1.50.3-beta1, but with 1.50.2 + 8aa10a0, I am able to control the way Dapper converts the |
Looks like @claycephas's fix is (or will be) in 1.50.3. Interestingly enough, my guids sourced from iBatis don't need an endian flip. |
I think the only right answer is for DBs to implement a proper Guid type |
…e issue: DapperLib#718). It implements the method suggested by numerous other users but leaves the byte order (endian) to the .net layer. It also fixes the guid equivalent issue raised in DapperLib#461.
I think this is also happening using MySQL when using a view that converts binary(16) to string using BIN_TO_UUID()..
|
While I agree that every db vendor should support a unique identifier data type, Snowflake current doesn't support it. Is the registration of a custom mapper the only way to handle this? |
Certainly not the only way. Arguably a better way is to only use types that map to your RDBMS at the tier that interacts with it, and worry about any other mappings externally. But yes, it is one possible way. |
My Id is defined in tSQL as
and in C# as
Dapper generates an error
Invalid cast from 'System.String' to 'System.Guid'
. One solution (from here) is to add a private IdString thusand changing the tSQL from
id
toId AS IdString
.It's a bit painful not to be able to use
SELECT *
because of that alias.Using
Guid
as an id column seems common practice.Should there not be a built in mechanism for casting between Guids and strings?
The text was updated successfully, but these errors were encountered: