编辑:谢谢大家,我想出了如何让它立即发挥作用!详情如下......
我是C#的新手,我正试图通过编写一个非常简单的RPG游戏来自学这门语言。
现在,我正处于想要开始添加不同敌人进行战斗的地步(到目前为止,我只使用了一个硬编码进行测试)。
我已经开始设置一个包含敌人信息的数据库(一列用于名称,一列用于HP,一列用于常见统计和攻击等)。我有它,所以当你开始与敌人战斗时,玩家可以从下拉列表中选择一个生物,而他所拥有的任何生物都会设置一个名为“EnemyID”的变量。
我想要做的是使用EnemyID变量来对应我数据库中的一行,然后将每列的值拉入变量,然后我可以在战斗中参考。
这是可以做的吗?如果是这样,有人可以用相对简单的术语向我解释这个方法吗?即使只是一个如何从任何类型的数据库导入行数据的小例子,我也很擅长在我看到它使用几次后理解代码。
(哦,是的,如果重要的话,我使用的是Visual Studio Express 2013,我的数据库是SQL Server Express 2014数据库。)
提前致谢!
编辑:
在找到ADO.NET的简单教程后,根据其中一张海报的建议,我想出了以下代码。
public void DataPoll()
{
SqlConnection MonDat = new SqlConnection("Data Source=(local);
Initial Catalog=TestDatabase;Integrated Security=SSPI");
SqlDataReader rdr = null;
try
{
MonDat.Open();
SqlCommand cmd = new SqlCommand(
"select * from Monsters where Id = EnemyID", MonDat);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
EnemyIDBuffer = (int)rdr["Id"];
EnemyName = (string)rdr["Name"];
EnemyHPBase = (int)rdr["HP"];
EnemyAtkBase = (int)rdr["Atk"];
EnemyDefBase = (int)rdr["Def"];
EnemyMagBase = (int)rdr["Mag"];
PrimAtk = (string)rdr["PrimAtk"];
SecoAtk = (string)rdr["SecoAtk"];
TertAtk = (string)rdr["TertAtk"];
RareAtk = (string)rdr["RareAtk"];
}
}
finally
{
if (rdr != null)
{
rdr.Close();
}
if (MonDat != null)
{
MonDat.Close();
}
}
}
但是,当我尝试运行它时,我的程序会停止并崩溃。我猜我配置错了(我只是从教程中获取脚本并稍微调整一下)。任何人都可以帮我弄清楚我哪里出错了吗?
EnemyID是一个变量我用来根据菜单选择分配敌人的战斗力。我正在尝试使用该变量生成行ID以从中提取其余的行数据,但我认为这可能会导致问题。
编辑2:我花了比实际应用的时间更长的时间,但我想通了。我不得不稍微改变我的代码。 SqlCommand cmd = new SqlCommand(
"select * from Monsters where Id = " + EnemyID, MonDat);
我习惯忘记你能加入这样的陈述。我创建了一个新项目,只调查数据并将其投入我的变量,然后将其放入文本框中,通过这种方法,我可以通过为两个不同的按钮分配不同的EnemyID值来轮询两组不同的敌人统计数据。概念证明,就在那里。
感谢两位回复的人,这两项建议对于让这项工作同样有用。 :)
答案 0 :(得分:4)
有很多关于如何使用数据库的教程,前两个使用直接ADO.NET,它是纯数据访问,使你负责代码中的交互:
接下来的两个,一个用于实体,另一个用于nHibernate,它们连接到SQL数据库,并通过称为对象关系映射的过程将对象转换为程序中的可用代码。
这些都是最新年份与VS 2013相关的所有相关链接;希望这能为你提供一个良好的起点。
答案 1 :(得分:0)
您可以这样做:
您的SQL应该传递过程名称和EnemyId。
存储过程会执行select * from Enemies where EnemyId = @EnemyId
DataSet dataSet = HSPDataAccessProxy.Instance.ExecuteDataSet(sql);
dataSet
具有存储过程返回的表,您可以从该表中检索所需的列。