I’ve written a function for both Insert and Select queries to my database and want to use the from other scripts. Now inserts seem to work without a problem but Select which has a return value throws me the huge stack trace and I’ve gotten nowhere with it.
This is the script calling the export
public class Class1 : BaseScript {
public Class1 () {
EventHandlers["playerConnecting"] += new Action<Player, string, dynamic, dynamic>(OnPlayerConnecting);
}
private void OnPlayerConnecting([FromSource]Player player, string playerName, dynamic setKickReason, dynamic deferrals) {
string playerLicense = player.Identifiers["license"];
List<object> playerData = Exports["sql"].SelectQueryHandler("SELECT * FROM users WHERE username = ?username", new List<object>() { playerName });
Debug.WriteLine("playerData: " + playerData);
if (playerData == null) {
Exports["sql"].InsertQueryHandler("INSERT INTO users(username, licenseIdentifier) VALUES(?username, ?licenseIdentifier)", new List<object>() { playerName, playerLicense });
}
Debug.WriteLine("END OF ONPLAYERCONNECTING");
}
}
And this is the Select query handler
public Class1() {
Debug.WriteLine("STARTED SQLTEST");
Exports.Add("SelectQueryHandler", new Func<string, List<object>, dynamic>( (query, parameters) => SelectQueryHandler(query, parameters) ));
Exports.Add("InsertQueryHandler", new Action<string, List<object>>( (query, parameters) => InsertQueryHandler(query, parameters) ));
}
public dynamic SelectQueryHandler(string query, List<object> parameters) {
using (MySqlConnection db = new MySqlConnection(dbString)) {
MySqlCommand cmd = new MySqlCommand(query, db);
string[] parameterNames = getParameterNames(query);
cmd.Connection.Open();
for (int i = 0; i < parameters.Count; i++) {
Debug.WriteLine("parameterNames[" + i + "] " + parameterNames[i]);
Debug.WriteLine("parameters[" + i + "] " + parameters[i]);
cmd.Parameters.Add(new MySqlParameter(parameterNames[i], parameters[i]));
}
//loop through my sql parameters
using (MySqlDataReader rdr = cmd.ExecuteReader()) {
if (!rdr.HasRows) { //if query returned nothing
return null;
}
DataTable dt = new DataTable();
dt.Load(rdr);
List<object> data = new List<object>();
object[] dataTable = new object[dt.Rows.Count];
dt.Rows.CopyTo(dataTable, 0);
data = dataTable.ToList<object>();
return data;
}
}
}
parameterNames[0] ?username
parameters[0] Billy
System.ArgumentException: method arguments are incompatible
Server stack trace:
at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, System.Boolean throwOnBindFailure, System.Boolean allowClosed) [0x002e3] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, System.Boolean throwOnBindFailure) [0x00000] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method) [0x00000] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Reflection.MonoProperty.CreateGetterDelegate (System.Reflection.MethodInfo method) [0x0005e] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[] index) [0x00053] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at CitizenFX.Core.MsgPackSerializer.Serialize (System.Object obj, MsgPack.Packer packer) [0x0025f] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\MsgPackSerializer.cs:140
at CitizenFX.Core.MsgPackSerializer.Serialize (System.Object obj, MsgPack.Packer packer) [0x0015e] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\MsgPackSerializer.cs:108
at CitizenFX.Core.MsgPackSerializer.Serialize (System.Object obj, MsgPack.Packer packer) [0x0015e] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\MsgPackSerializer.cs:108
at CitizenFX.Core.MsgPackSerializer.Serialize (System.Object obj) [0x00020] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\MsgPackSerializer.cs:55
at CitizenFX.Core.FunctionReference.Invoke (System.Int32 reference, System.Byte[] arguments) [0x00098] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\FunctionReference.cs:84
at CitizenFX.Core.InternalManager.CallRef (System.Int32 refIndex, System.Byte[] argsSerialized, System.IntPtr& retvalSerialized, System.Int32& retvalSize) [0x00000] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\InternalManager.cs:258
at (wrapper remoting-invoke-with-check) CitizenFX.Core.InternalManager:CallRef (int,byte[],intptr&,int&)
at (wrapper xdomain-dispatch) CitizenFX.Core.InternalManager:CallRef (object,byte[]&,byte[]&,int,byte[],int&)
Exception rethrown at [0]:
at (wrapper xdomain-invoke) CitizenFX.Core.InternalManager:CallRef (int,byte[],intptr&,int&)
at (wrapper remoting-invoke-with-check) CitizenFX.Core.InternalManager:CallRef (int,byte[],intptr&,int&)
at CitizenFX.Core.MonoScriptRuntime.CallRef (System.Int32 refIndex, System.Byte[] argsSerialized, System.Int32 argsSize, System.IntPtr& retvalSerialized, System.Int32& retvalSize) [0x00013] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\MonoScriptRuntime.cs:210
Error invoking callback for event Test: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentNullException: Value cannot be null.
Parameter name: src
at (wrapper managed-to-native) System.Runtime.InteropServices.Marshal:copy_from_unmanaged (intptr,int,System.Array,int)
at System.Runtime.InteropServices.Marshal.Copy (System.IntPtr source, System.Byte[] destination, System.Int32 startIndex, System.Int32 length) [0x00000] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at CitizenFX.Core.RemoteFunctionReference._InvokeNative (System.Byte[] argsSerialized) [0x00058] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\RemoteFunctionReference.cs:90
at CitizenFX.Core.RemoteFunctionReference.InvokeNative (System.Byte[] argsSerialized) [0x00000] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\RemoteFunctionReference.cs:72
at CitizenFX.Core.MsgPackDeserializer+<>c__DisplayClass36_0.<CreateRemoteFunctionReference>b__0 (System.Object[] args) [0x00007] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\MsgPackDeserializer.cs:267
at (wrapper dynamic-method) System.Object:CallSite.Target (System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object,object[])
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet] (System.Runtime.CompilerServices.CallSite site, T0 arg0, T1 arg1) [0x0010f] in <48501e5f32e8491e924f8b8beae3e4f6>:0
at CitizenFX.Core.ExportSet.TryInvokeMember (System.Dynamic.InvokeMemberBinder binder, System.Object[] args, System.Object& result) [0x000f3] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\ExportDictionary.cs:61
at (wrapper dynamic-method) System.Object:CallSite.Target (System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object,string,System.Collections.Generic.List`1<object>)
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid3[T0,T1,T2] (System.Runtime.CompilerServices.CallSite site, T0 arg0, T1 arg1, T2 arg2) [0x00110] in <48501e5f32e8491e924f8b8beae3e4f6>:0
at CharacterCreationServer.Class1.Test () [0x000b9] in <7e7a81560a874c7694b39a4406066fd0>:0
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00032] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
--- End of inner exception stack trace ---
at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00048] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Delegate.DynamicInvokeImpl (System.Object[] args) [0x000e7] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.MulticastDelegate.DynamicInvokeImpl (System.Object[] args) [0x00008] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at System.Delegate.DynamicInvoke (System.Object[] args) [0x00000] in <0123fd5b1a1040fe9d70a7e0d4b28acb>:0
at CitizenFX.Core.EventHandlerEntry+<Invoke>d__5.MoveNext () [0x00064] in C:\gl\builds\4ff63adb\0\cfx\fivem\code\client\clrcore\EventHandlerDictionary.cs:85
if I call the function from the resource itself without the usage of exports everything worked but now transferring to exports has caused this error and from what I was able to debug it seems like the error is thrown when the export tries to give a value back.