【问题标题】:Counting rows in mysql table through procedure and interface in c#通过c#中的过程和接口计算mysql表中的行数
【发布时间】:2017-05-13 18:07:32
【问题描述】:

我正在尝试为 Grand Theft Auto V 修改构建脚本。它本质上是在线角色扮演服务器的毒贩工作。

我有如下界面:

namespace DrugDealer
{
    public interface IDrugDealerJobRepository
    {
        DrugDealerJob GetJob(int jobId);
        int CountJobs();
    }
}

我有以下课程:

namespace DrugDealer
{
    public class DrugDealerJob
    {
        public int JobId { get; set; }
        public string Drug { get; set; }
        public int UnitBuyPrice { get; set; }
        public int UnitSalePrice { get; set; }
        public string Location { get; set; }
        public string Vehicle { get; set; }
        public string VehicleHash { get; set; }
        public float X { get; set; }
        public float Y { get; set; }
        public float Z { get; set; }
    }
}

我有以下作为主要的类:

using System;
using System.Collections.Generic;
using GTANetworkServer;
using Insight.Database;
using Insight.Database.Providers.MySql;
using MySql.Data.MySqlClient;
using Database;
using System.Threading;

namespace DrugDealer
{
    public class Main : Script
    {
        private static MySqlConnectionStringBuilder _database;
        private IUserRepository _userRepository;
        private IDrugDealerJobRepository _drugDealerJobRepository;

        public Main()
        {
            API.onResourceStart += API_onResourceStart;
        }

        private void API_onResourceStart()
        {
            API.consoleOutput("Starting DrugDealer!");

            MySqlInsightDbProvider.RegisterProvider();
            _database = new MySqlConnectionStringBuilder("");
            _userRepository = _database.Connection().As<IUserRepository>();
            _drugDealerJobRepository = _database.Connection().As<IDrugDealerJobRepository>();

            ThreadStart drugDealerJob = new ThreadStart(StartDrugDealerJob);
            Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Creating the drug dealer job thread");
            Thread dealerJob = new Thread(drugDealerJob);
            dealerJob.Start();
        }

        public void StartDrugDealerJob()
        {
            Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Dealer Job Starts thread");

            // keep checking until players are on the server
            PlayersOnServer();

            int sleepfor = 5000; // 3600000 in one hour which we be using later
            int i = 10;
            while (i != 0)
            {
                List<Client> players = API.getAllPlayers();
                foreach(Client player in players)
                {
                    int numberOfJobs = _drugDealerJobRepository.CountJobs();
                    Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Number of Jobs:  {0}", numberOfJobs);
                    DrugDealerJob currentJob = _drugDealerJobRepository.GetJob(new Random().Next(1, numberOfJobs));
                    Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] A Drug Shipment of {0} has arrived at {1}. Look out for a {2}", currentJob.Drug, currentJob.Location, currentJob.Vehicle);

                    Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] {0} has a job of {1}", player.name, _userRepository.GetAccount(player.name).Job);
                    if(_userRepository.GetAccount(player.name).Job != "Cop")
                    {
                        //API.sendChatMessageToPlayer(player, "A new shipment of {0} has arrived at the following location: {1}", );
                    }
                }

                Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Dealer Job thread Paused for {0} seconds", sleepfor / 1000);
                Thread.Sleep(sleepfor);
                Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Dealer Job thread resumes");
                i--;
            }

            Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Dealer Job Ends thread");
        }

        public void PlayersOnServer()
        {
            // the thread is paused for 5000 milliseconds
            int sleepfor = 5000;
            List<Client> players;

            // make thread loop endlessly until a user connects
            do
            { 
                players = API.getAllPlayers();
                Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] Checking Player Count: {0}", players.Count);
                if (players.Count == 0)
                    Thread.Sleep(sleepfor);

            } while (players.Count == 0);
        }
    }
}

当我在添加资源的情况下运行服务器时,出现错误,并且在到达以下代码行时服务器崩溃:

int numberOfJobs = _drugDealerJobRepository.CountJobs();

我已从连接字符串中删除了敏感数据,但它工作正常,因为如果我删除导致错误的行,那么以下行将按预期工作,返回作业数据:

DrugDealerJob currentJob = _drugDealerJobRepository.GetJob(new Random().Next(1, numberOfJobs));

我似乎不知道如何使用 Visual Studio 来调试我的脚本。如果有人知道如何做到这一点,那么我将不胜感激。

应用程序通过接口连接到 mysql 数据库,该接口引用了我在 mysql 数据库中创建的过程。

Procedure CountJobs(无参数):

SELECT COUNT(*)
FROM drugdealerjobs

Procedure GetJob(参数jobid):

SELECT
t1.jobid
,t1.drug
,t1.unitbuyprice
,t1.unitsaleprice
,t1.location
,t1.vehicle
,t1.vehiclehash
,t2.x
,t2.y
,t2.z
FROM drugdealerjobs AS t1
INNER JOIN jobcoordinates AS t2
ON t1.jobid = t2.jobid
WHERE t1.jobid = jobid

有什么想法我可能做错了吗?我认为它与接口定义有关,但可以使用一些帮助。

非常感谢 Comic Coder

【问题讨论】:

    标签: c# mysql stored-procedures interface


    【解决方案1】:

    在我看来,问题是CountJobs 返回int。从CountJobs返回System.Int64可以解决这个问题。

    1) CountJobs 应返回 System.Int64

    2) 或者将ExecuteScalar的返回值转换为int

    count = Convert.ToInt32(cmd.ExecuteScalar());
    

    如果这不能解决问题,您能否分享这两种方法的实现。

    DrugDealerJob GetJob(int jobId);
    int CountJobs();
    

    【讨论】:

    • 将 CountJobs 的返回值转换为 System.Int64 就可以了。
    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2013-07-12
    • 1970-01-01
    • 2012-12-17
    • 2019-03-22
    相关资源
    最近更新 更多